【发布时间】:2018-09-28 02:13:20
【问题描述】:
下面的示例代码代表了我正在尝试做的事情,并且对于为什么 Promises.all.then() 中的 console.log 甚至在单个承诺完成之前就完成了,我感到很困惑。我认为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")})
我可以知道上面的代码有什么问题吗?我没有按预期执行承诺吗?
【问题讨论】:
-
我有一个类似问题的答案,尽管问题的表述不同:“如何满足 lint 规则'array-callback-return'?”:stackoverflow.com/a/45418236/2430549
-
这里是关于代码风格的附加题外评论。
setTimeout接受任何附加参数并将它们应用于回调。你也可以这样写,我认为这样更好看。new Promise(resolve => setTimeout(resolve, 2000, "foo success"))
标签: javascript