javascript - 使用 JavaScript Promise 时如何传递信息
问题描述
在某一时刻,我们用 . 多次调用我们的后端fetch
。每个调用都会返回一个 Promise,我们将其收集并传递给我们的responseHandler
. 这个处理程序应该在每个响应进来时调度 redux 动作。动作将根据两个因素而不同:
- 服务器的响应码
- 请求的内容
所以我们有这个
function save(objects) {
let promises = objects.map(object => {
let promise = fetch(url, {..., body: object});
});
responseHandler(promises);
}
function responseHandler(promises) {
for (let promise of promises) {
promise
.then(r => {
return r.json();
})
.then(body => dispatchSomeAction(body));
}
}
到目前为止,一切都很好。但是现在我们需要来自接收对象save
的匿名函数内部和内部的信息。response
所以我想出了以下方法。但是捎带 Promise 对象感觉不对。我不能说为什么。
function save(objects) {
let promises = objects.map(object => {
let promise = fetch(url, {..., body: object});
promise._objectType = object._type;
});
responseHandler(promises);
}
function responseHandler(promises) {
for (let promise of promises) {
promise
.then(r => {
promise._status = r.status;
return r.json();
})
.then(body => dispatchSomeAction({
status: promise._status,
type: promise._type, ...body
}));
}
}
可以看出,每次我希望某个范围的值在以后可用时,我都会将它放在 Promise 对象上,因为该 Promise 对象在所有其他范围内。有没有更清洁的方法?
注意:后端返回一个不包含该_type
属性的对象(实际上我在将它们发送到后端之前清除了这些标志的对象。这是一个前端标志,当答案到来时我仍然需要它)
解决方案
您必须携带该物品。使用 ES6 结构化和解构并不是很笨拙:
function save(objects){
let promises = objects.map(object => {
return fetch(url, {..., body: object}).then(r => ({r,type:object._type}));
}
responseHandler(promises)
}
function responseHandler(promises){
for (let promise of promises){
promise
.then(({r,type}) => {
return r.json().then(body => dispatchSomeAction({status: r.status, type, ...body));
});
}
}
请注意,您实际上根本不需要对状态做任何事情,因为它仍然在使用它的范围内。
推荐阅读
- android - 文本字段中的“00:00”格式(颤振)
- python - Fernet 加密算法的替代方案
- c# - 具有实体框架的存储过程中的可空数据集异常
- swift - 使用 swift grpc 客户端快速的 Google pubsub 客户端?
- xamarin.android - 在 xamarin.android 中管理屏幕旋转时的片段外观
- r - 如何根据第二个值从第一列创建汇总列
- javascript - 如果一个函数返回新的 promise,它是否需要 async 关键字?
- c - unload() 函数的问题(CS50 第 5 周:Speller)
- javascript - 当没有按钮时,如何防止获取请求在 Javascript 中重新加载页面?
- python - 创建新列,该列是按日期计算的一列和另一列的总和