我正在尝试一次更新多个项目,我必须为每个项目发出网络请求。我正在使用fetch来发出请求。
这是我的意思的一个例子:
const updateItems = items => items.forEach(item => api.create(item))
api.create
可能看起来像这样:
create: item => fetch(url, config(item)).then(handleErr).then(handleRes)
如何确保我成功批量处理所有事情?每个create
都是一个承诺,但是我无法将Promise.all用作包装器,因为我收到以下错误:Cannot read property 'Symbol(Symbol.iterator)' of undefined
然而,更新是成功的,所以我做错了什么!
答案 0 :(得分:1)
您的代码应该是:fetch(url, config(item)).then(handleRes).catch(handleErr)
并且调用您的方法的代码应该使用Promise.all
和items.map
,因此调用代码可以对结果执行某些操作(失败并成功)。
一个例子(这里updateItems
不会发现任何错误,调用代码会):
const Fail = function(details){this.details=details;},
isFail = item => (item && item.constructor)===Fail;
Promise.all(
items.map(//map array of items to array of promises that don't reject
item =>
updateItems(item)
.then(
undefined,//do not handle resolve yet
//when you handle the reject this ".then" will return
// a promise that RESOLVES to the value returned below (new Fail([item,err]))
err=>new Fail([item,err])
)
)
)
.then(
responses => {
console.log("failed requests:");
console.log(
responses.filter(//only Fail type
isFail
)
);
console.log("resolved requests:");
console.log(
responses.filter(//anything not Fail type
response=>!isFail(response)
)
);
}
);
该代码来自following answer解释承诺。