以下示例代码代表了我想要做的事情,但我很困惑为什么 Promises.all.then()
内的 console.log
之前完成就连个人的 promise 也都完成了。我认为 map
语句可能与它有关,但我不确定。
我使用map
的目的是收集所有成功和/或失败的情况,并在稍后进行批量操作时通知用户。
var requests = []; var success=[]; var failures = [];
requests.push(new Promise((resolve, reject) => setTimeout(() => resolve("foo success"), 2000)));
requests.push(new Promise((resolve, reject) => setTimeout(() => reject("bar failure"), 1000)));
requests.push(new Promise((resolve, reject) => setTimeout(() => resolve("foo2 success"), 2000)));
requests.push(new Promise((resolve, reject) => setTimeout(() => reject("bar2 failure"), 1000)));
Promise.all(requests.map(p => {
p.then(r => {
console.log(r)
success.push(r);
});
p.catch((e) => { console.log(e); failures.push(e); });
})).then(function () { console.log("ALL promises completed")})
我可以知道上面的代码有什么问题吗?我是不是没有按预期履行 promise ?
最佳答案
这是因为您的 requests.map(...)
回调不会返回任何内容,因此您将 Promises 映射到 undefined
值(value)观。因此,您正在通过 Promise.all
调用等待一组 undefined
值。更改为以下内容:
Promise.all(requests.map(p => {
p.then(r => {
console.log(r)
console.log("POSTed a record successfuly");
success.push(r);
});
p.catch((e) => { console.log(e); failures.push(e); });
return p;
})).then(function () { console.log("POSTED ALL")})
更新:
正如 @JoeFrambach 指出的,如果您希望 Promise.all 包含原始请求 Promises 的内容,您将需要返回原始 Promises。由于这很可能是您想要做的,因此我更新了我的答案。
关于javascript - Promise.all.then 在各个 Promise 完成之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542211/