javascript - 是否有可能捕获链式 promise 之间的错误?

标签 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”语句的顺序被解雇吗?

最佳答案

这取决于您的实际目标。

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

  • onFullfilled: promise 完成时调用的回调。
  • onRejected: promise 被拒绝时调用的回调。

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

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

  • 如果不是 promise ,则为该值的已解决 promise 。
  • 如果它已经是一个 promise (将被履行或拒绝),则为实际返回值。
  • 如果返回值是被拒绝的 Promise(如上一点所述)或抛出任何错误,则被拒绝的 Promise。

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

这样做的结果是,如果在 onFullfill 回调中抛出错误(或者它返回一个碰巧解析为拒绝状态的 Promise),它将被链式 捕获>.catch() 也是如此。

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

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

你正在链接 promise “假设”一切都会顺利“并且只在最后检查”。也就是说:每当任何步骤失败时,所有后续的 .then() 都会被绕过到下一个(在本例中是最后一个).catch()

另一方面,如果您在中间插入更多 .catch(),您将能够更早地拦截被拒绝的 Promise,并在适当的情况下解决发生的任何问题并将其转化为再次解决状态以恢复链。

关于javascript - 是否有可能捕获链式 promise 之间的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54762145/

相关文章:

javascript - jQuery 将焦点设置在元素之外

javascript - 在 Chrome 中使用 React Native 调试 ES6 import 语句

javascript - React'findNodeHandle 方法停止工作

javascript - 用于验证重音符号、空格和仅字母的正则表达式

javascript - 使用 jQuery 包装 html 的一部分

javascript - Node.JS,服务器在请求过程中关闭 Keep-Alive 连接

javascript - 事件处理程序的幕后情况是怎样的?它适用于其他功能吗?

javascript - react native : sending events from android to javascript

javascript - 开 Jest 错误意外的 token ...(ES6)

playframework - 玩框架ES6->ES5转译器?