gpt4 book ai didi

javascript - Promise.all.then 在各个 Promise 完成之前执行

转载 作者:行者123 更新时间:2023-11-28 14:27:54 25 4
gpt4 key购买 nike

以下示例代码代表了我想要做的事情,但我很困惑为什么 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com