所以我想知道这是否有效?
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/