【问题标题】:I was going through MDN docs on Promises And came up with an example which i am not able to understand.Can Anyone explain the flow to me我正在浏览关于 Promises 的 MDN 文档并提出了一个我无法理解的示例。有人可以向我解释一下流程吗
【发布时间】:2021-07-10 12:45:51
【问题描述】:

promise 得到解决 CB 然后运行然后它在 catch 块运行之后抛出一个被拒绝的 promise 那么为什么另一个然后运行呢?我无法理解它背后的流程确实 catch 也返回一个新的承诺?

代码-

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");
  })

输出- 即使之前的承诺被拒绝,我也总是被召唤

onRejected 函数调用:哦不!

【问题讨论】:

  • 是的,catch() 也是 returns a Promise
  • .catch() 处理拒绝,因此它返回的承诺不是拒绝的,而是履行的
  • 一旦您进入Promise 领域,您将始终返回Promise。所以.catch().then() 都会返回一个promise。他们返回的都是关于提供的回调返回的内容。你可以做一个.catch(e => (handleError(e), Promise.resolve(3))) 并继续另一个.then() 阶段。

标签: javascript reactjs asynchronous es6-promise


【解决方案1】:

then()catch() 方法都返回一个承诺,它们返回的承诺取决于两件事:

  • 调用它们的原始承诺会发生什么?

  • 他们的回调函数返回什么?

最后一个 then() 方法是在 catch() 方法返回的承诺上调用的,并且由于 catch() 方法在您的代码中隐式返回 undefined,catch() 方法返回的承诺使用undefined 的值,然后调用 then() 方法。

如果要停止执行最后一个then() 方法,则需要拒绝catch() 方法返回的promise。 这可以通过重新抛出错误或返回被拒绝的承诺来完成。


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

  1. Promise.resolve() 返回一个已解决的承诺

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

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

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

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

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

  4. catch()方法返回的promise被解析后,它会调用最后一个then()方法的回调函数

【讨论】:

  • 为什么最后一个 console.log() 在 catch 之前运行?
  • catch() 方法中的console.error 在最后一个then() 方法中的console.log 执行之前
  • 它没有运行之前 catch one
  • 我在这个网站上运行了它onecompiler.com/javascript/3x52gcwsz 即使之前的承诺拒绝了 onRejected 函数,我也总是被调用:哦,不!这是结果,但在这里运行代码 sn-p 它的工作方式与您解释的完全相同。
  • 非常感谢您的帮助。
猜你喜欢
  • 2021-07-11
  • 2014-04-20
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多