所以我想知道这是否有效?
S3.getObject()
.promise()
.then()
.catch() // catch error from the first then() statement
.then()
.catch() // catch error from the second then() statement
还是我需要将所有“捕捉”放在最后?那我可以多抓吗?是否会按照引发错误的'then'语句顺序将其解雇?
答案 0 :(得分:3)
这取决于您的实际目标。
事实上,.then()
方法有两个参数:
实际上,.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()
,则可以更早地拦截被拒绝的承诺,并在适当的情况下解决所发生的一切并将其再次按顺序变为已解决状态恢复链。