是否有可能在链式承诺之间捕获错误?

时间:2019-02-19 08:51:35

标签: javascript ecmascript-6

所以我想知道这是否有效?

S3.getObject()
  .promise()
  .then()
  .catch() // catch error from the first then() statement
  .then()
  .catch() // catch error from the second then() statement

还是我需要将所有“捕捉”放在最后?那我可以多抓吗?是否会按照引发错误的'then'语句顺序将其解雇?

1 个答案:

答案 0 :(得分:3)

这取决于您的实际目标。

事实上,.then()方法有两个参数:

  • onFullfilled :在实现诺言时要调用的回调。
  • onRejected :拒绝诺言时要调用的回调。

实际上,.catch(fn)只是.then(null, fn)的简写。

.then().catch()均返回一个新的承诺,该承诺解决为其返回值。换句话说:

  • 已解决的价值承诺(如果不是承诺的话)。
  • 实际的返回值,如果已经是一个承诺(将实现或拒绝)。
  • 如果返回值是被拒绝的承诺(如前所述)或抛出任何错误,则被拒绝的承诺。

使用.then(onFullfill).catch(onReject)模式而不是.then(onFullfill, onReject)的主要原因是,在前者(相当于.then(onFullfill).then(null, onReject))中,我们链接了onReject回调第一个.then()返回的承诺,而不是直接返回到原始承诺。

其结果是,如果在onFullfill回调中引发en错误(或者它返回一个承诺,碰巧将其解析为拒绝状态),则将被链接的.catch()捕获

因此,当您执行以下操作时,回答您的问题:

P.then(...)
 .then(...)
 .then(...)
 .catch(...)
;

您正在连锁承诺“假设”一切都会好起来的“仅在最后检查”。也就是说:每当任何步骤失败时,所有随后的.then()都会绕过下一个(在这种情况下为最后一个).catch()

另一方面,如果您在两者之间插入更多.catch(),则可以更早地拦截被拒绝的承诺,并在适当的情况下解决所发生的一切并将其再次按顺序变为已解决状态恢复链。