Javascript 承诺链接多个错误

Javascript Promises Chaining Multiple Errors

为什么我所有已解决的回调都正确执行但仅 1 错误回调正在 运行 ?

在此处的示例中,如果 longOperation(true) 我只收到一个错误,而当 运行 为 false 时,我收到两条已解决的消息。在我的理解中,每个 .then returns 一个新的承诺,它处于第二个 .then 错误回调注册的错误状态

此示例是使用 Typescript 编写的!

function longOperation(error) {
  return new Promise < any > ((resolve, reject) => {
    if (error) {
      reject("Error")
    } else {
      setTimeout(function() {
        resolve(true)
      }, 1000)
    }

  })
}

let op = longOperation(true);

op
  .then(result => {
    console.log("Resolved #1")
  }, undefined)
  .then(result => {
    console.log("Resolved #2")
  }, undefined)
  .then(undefined, error => {
    console.log("Error1")
  })
  .then(undefined, error => {
    console.log("Error2")
  })

第一个错误处理程序捕获错误,就像常规的 catch 块一样。如果你想链式承诺被拒绝,你必须重新抛出错误:

Promise.reject().then(() => {
  console.log(1);
}).then(() => {
  console.log(2);
}).then(null, e => {
  console.log(3);
  throw e; // <= rethrow here
}).then(null, e => {
  console.log(4);
});

承诺可以"recover".

错误将沿着“.then”链向下传播,直到找到错误回调。当它这样做时,它将执行错误回调并将 return 值传递给下一个 promise 的 resolve 方法。

所以只有下一个最接近承诺的错误回调才会被执行。

如果您想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理。

在您的代码示例中,您实际上创建了 5 个承诺。每个“.then”的原始 1 和 1。第二个和第三个只有一个 onResolved 方法,最后两个只有一个 onRejected 方法。

这是它将如何执行:

第一个承诺(op):我刚刚拒绝了。我看到我有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。

第二个承诺:之前的承诺调用了我的拒绝方法,我还有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。

第三个承诺:之前的承诺调用了我的拒绝方法。我也有一个延迟承诺,但我的确实有一个 onRejected 回调。我将使用我拒绝的值调用回调,我将使用回调的 return 值调用我的延迟承诺的 resolve 方法。

第四个承诺:之前的承诺调用了我的 resolve 方法。我有一个延迟的承诺,但它没有 onResolved 回调,所以我将使用我解析的值调用它的解析方法。

第五个承诺:之前的承诺调用了我的 resolve 方法。我决定了,什么也没做,因为我没有延期承诺。