javascript - Promise.all catch 的奇怪行为在第一个单个 Promise catch 之后运行,然后所有的都被拒绝

标签 javascript es6-promise

当 catch() 方法在第一个单个 Promise 之后和所有其他 Promise 之前触发时,发现 Javascript Promise.all() 的行为非常奇怪。以前有人发现过这种奇怪的事情吗?我想知道这背后发生了什么?

let promises = [];
[1, 2, 3].forEach((value) => {
    const promise = new Promise((s, e) => {
        setTimeout(() => {
            e('Single Catch ' + value);
        }, Math.random() * 100);
    }).catch((err) => {
        console.log(err);
        return Promise.reject(err);
    });
    promises.push(promise);
});
Promise.all(promises).catch((err) => {
    console.log('All Done');
});

预期结果是:

- Single Catch X
- Single Catch X
- Single Catch 1
- All Done

但是我们得到:

- Single Catch X
- All Done
- Single Catch X
- Single Catch X

最佳答案

根据文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

当第一个 Promise 中的任何一个被拒绝时,它就会被拒绝。

因此,当您的一个 catch block 返回一个被拒绝的 Promise 时,Promise.all 就全部完成了。

关于javascript - Promise.all catch 的奇怪行为在第一个单个 Promise catch 之后运行,然后所有的都被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464426/

相关文章:

javascript - JS setInterval 被多次调用

javascript - 在JS中,如何仅在多个map函数完成时才运行一段代码?

javascript - 根据 Adonis.js 中数据库的结果更改 HTML 标签

javascript - 单击标题内的特定元素时如何禁用 Bootstrap 折叠?

javascript - promise 解决得太快

reactjs - 如何在axios中取消/中止ajax请求

Javascript Promise 在 catch block 中解析

node.js - 将 Promise 设置为变量并在稍后使用它

javascript - 在 Promise 中使用 async 、 double then() 的正确方法? node8,真的需要 babel 到 es5 吗?

javascript - Yii GridView Ajax 更新不起作用