【问题标题】:How to catch errors in a sequential promise chain如何在顺序承诺链中捕获错误
【发布时间】:2016-11-30 16:59:49
【问题描述】:

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

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

(通过this article 的“执行系列承诺”部分)。这会像我期望的那样按顺序运行所有内容,但是在捕获错误/将catch 块放在哪里时遇到问题。

【问题讨论】:

  • 旁注:即使像这样解析和链接,promise 也会异步执行。
  • 一些想法:这些并不是真正同步的,它们是顺序的(所有的 Promise 都是异步的,总是......这听起来像迂腐,但如果你在外部世界中改变状态,它会有很大的不同);如果您想独立处理错误情况,基于将失败转换为序列中的下一个调用成功,那么您需要更改数据格式,或者您需要接受任何一个都可能失败,并允许消费者捕捉错误;最后,如果你不保存对方的承诺,你就无法传递它。

标签: javascript promise ecmascript-6 es6-promise


【解决方案1】:

把它放在最后,你通常也会继续使用链:

[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);
});

【讨论】:

    【解决方案2】:

    你不一定需要一个 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"))
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多