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

标签 javascript

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

相关文章:

javascript - 未捕获的 TypeError : $(. ..).cytoscape 不是函数

javascript - XPage 事件 onStart 和 onComplete 与 dojo.connect 结合使用

javascript - AngularJS 分页 - 获取当前页面并传递给 Controller

javascript - 如何关闭 CKEditor 焦点时烦人的屏幕跳转

javascript - 如何在单元测试中触发 element.on ('mouseleave' ) 来调用我的 AngularJS 函数

javascript - 基本身份验证 Angular2(非 CORS)

javascript - 使用 javascript 自动滚动定期从网站上抓取和下载所有图像

javascript - JSON 上的 jQuery $.each

javascript - FullCalendar .start 没有正确获得小时

javascript - 从文本框中提取用户输入并将其存储在javascript中的变量中