首页 > 解决方案 > Promise.all catch 的奇怪行为在第一个 promise catch 之后运行,然后全部被拒绝

问题描述

当 catch() 方法在第一个单一承诺之后和所有其他承诺之前触发时,发现 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

标签: javascriptes6-promise

解决方案


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

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

所以当你的一个 catch 块返回一个被拒绝的承诺时, Promise.all 就完成了。


推荐阅读