我正在构建一个同步的Promise系列,如下所示:
let order = [fn1, fn2, fn3];
let result = Promise.resolve();
order.reduce((chain, task) => {
return chain.then(task);
}, result);
(通过&{39;执行系列中的承诺' this article部分)。这会像我期望的那样按顺序运行所有内容,但是在捕获错误/放置catch
块的位置时遇到问题。
答案 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"))