promise 得到解决 CB of then 运行然后它在 catch block 运行后抛出一个被拒绝的 promise 那么为什么另一个然后运行呢?我无法理解它背后的流程是否 catch 也返回一个新的 promise ?
代码-
Promise.resolve()
.then(() => {
// Makes .then() return a rejected promise
throw new Error('Oh no!');
})
.catch(error => {
console.error('onRejected function called: ' + error.message);
})
.then(() => {
console.log("I am always called even if the prior then's promise rejects");
})
输出- 即使之前 then 的 promise 被拒绝,我也总是被调用
onRejected 函数调用:哦不!
最佳答案
then()
和 catch()
方法都返回一个 promise,它们返回的 promise 取决于两件事:
调用它们的原始 promise 会怎样?
他们的回调函数返回了什么?
最后一个 then()
方法在 catch()
方法返回的 promise 上调用,作为 catch()
方法,在您的代码中,隐式返回 undefined,catch()
方法返回的 promise 被解析为 undefined
的值,然后调用 then()
方法。
如果你想停止执行最后一个then()
方法,那么你需要拒绝catch()
方法返回的promise。
这可以通过重新抛出错误或返回被拒绝的 promise 来完成。
您的代码按如下所述执行:
Promise.resolve()
返回已解决的 promise步骤 1 中已解决的 promise 导致调用
Promise.resolve().then(...)
方法的回调函数- 由于
Promise.resolve().then(...)
的回调函数抛出错误,then()
方法返回的 promise 被 rejected with错误对象作为拒绝原因。
- 由于
由于步骤2中
then()
方法返回的promise被拒绝,导致调用catch()
方法的回调函数。catch()
方法的回调函数记录错误由于
catch()
方法的回调函数中没有显式返回语句,回调方法隐式返回undefined
。catch()
方法返回的 promise 由其回调函数的返回值解析,即undefined
由于
catch()
方法返回的promise被resolved,它调用最后一个then()
方法的回调函数
关于javascript - 我正在阅读关于 promise 的 MDN 文档并想出了一个我无法理解的例子。任何人都可以向我解释流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68327830/