如何捕获同步承诺链中的错误

时间:2016-11-30 16:59:49

标签: javascript promise ecmascript-6 es6-promise

我正在构建一个同步的Promise系列,如下所示:

let order = [fn1, fn2, fn3];
let result = Promise.resolve();
order.reduce((chain, task) => {
    return chain.then(task);
}, result);

(通过&{39;执行系列中的承诺' this article部分)。这会像我期望的那样按顺序运行所有内容,但是在捕获错误/放置catch块的位置时遇到问题。

2 个答案:

答案 0 :(得分:5)

只需将它放在最后,你也可以继续使用链条:

[fn1, fn2, fn3].reduce((chain, task) => {
    return chain.then(task);
}, Promise.resolve()).catch(err => {
    console.error(err);
});

请记住reduce扩展为

Promise.resolve().then(fn1).then(fn2).then(fn3).catch(err => {
    console.error(err);
});

答案 1 :(得分:0)

您不一定需要一个catch块。 reduce将返回链中第一个被拒绝的承诺。要看到这一点,请写出reduce实际产生的内容:

const resolve = () => Promise.resolve(), reject = () => Promise.reject();
const promises = [resolve, reject, resolve];

const result = Promise.resolve()
   .then(resolve).then(reject).then(resolve);

将调用第一个then处理程序,从而产生履行的承诺,因此将调用下一个then处理程序,这次导致拒绝的承诺,因此最终then将不会调用其处理程序并将“通过”被拒绝的承诺,这将成为整个表达式的结果,并且您可以使用

result.catch(() => alert("Hey Mom, one of the chained promises rejected"))