javascript - 我正在阅读关于 promise 的 MDN 文档并想出了一个我无法理解的例子。任何人都可以向我解释流程

标签 javascript reactjs asynchronous es6-promise

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 来完成。


您的代码按如下所述执行:

  1. Promise.resolve() 返回已解决的 promise

  2. 步骤 1 中已解决的 promise 导致调用 Promise.resolve().then(...) 方法的回调函数

    • 由于 Promise.resolve().then(...) 的回调函数抛出错误,then() 方法返回的 promise 被 rejected with错误对象作为拒绝原因。
  3. 由于步骤2中then()方法返回的promise被拒绝,导致调用catch()方法的回调函数。

    • catch() 方法的回调函数记录错误

    • 由于catch()方法的回调函数中没有显式返回语句,回调方法隐式返回undefined

    • catch() 方法返回的 promise 由其回调函数的返回值解析,即 undefined

  4. 由于catch()方法返回的promise被resolved,它调用最后一个then()方法的回调函数

关于javascript - 我正在阅读关于 promise 的 MDN 文档并想出了一个我无法理解的例子。任何人都可以向我解释流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68327830/

相关文章:

javascript - 如何设置这个嵌套对象的状态?

node.js - reducer 和中间件有什么区别?

c# - 为什么在 Windows 服务中阻塞异步会导致死锁?

javascript - 从远程服务器调用 JavaScript 函数

Javascript通过选择类获取元素

javascript - 如何查找 jQuery 选择器(使用 :contains) result set's complement

.NET 异步套接字与后台 worker

javascript - 面向对象的 javascript - "this"关键字和对象内的访问函数

reactjs - React Router 4 params prop 上的 PropTypes isRequired

javascript - 加载异步 javascript 时触发事件