Unresolved promise - 开头由 then() 返回的 Promise pending

问题描述 投票:0回答:1

then()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#return_value

返回值 立即返回一个新的 Promise。 无论当前承诺的状态如何,这个新承诺在返回时总是待处理

catch()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch#return_value

返回值 返回一个新的 Promise。 无论当前承诺的状态如何,这个新承诺在返回时始终处于待处理状态。如果 onRejected 抛出错误或返回本身被拒绝的 Promise,它最终会被拒绝;否则,它最终会实现。

finally()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally#description

像 catch() 一样,finally() 在内部调用被调用对象的 then 方法。如果 onFinally 不是函数,则调用 then() 时将 onFinally 作为两个参数——这对于 Promise.prototype.then() 来说意味着没有附加有用的处理程序。否则,then() 将使用两个内部创建的函数调用,其行为如下:

MDN文档说,

then()
catch()
返回的promise一开始总是处于pending状态。

据我了解,这是因为那些方法本身是同步执行的,但是它们的回调是异步执行的。 此类回调对于了解承诺是否将被 resolvedrejected 是必要的,并且由于这些稍后执行,此类方法返回的承诺将是 unresolved,因此 pending 直到此类回调被执行。

https://tc39.es/ecma262/#sec-promise-objects

如果承诺已解决或已“锁定”,则承诺已解决 匹配另一个承诺的状态。试图解决或拒绝 已解决的承诺无效。如果不是,则承诺未解决 解决。 未解决的承诺总是处于未决状态。 A 已解决的承诺可能是未决的、已履行的或已拒绝的。

  1. 我的理解对吗?
  2. 如果按我的理解是正确的,
    finally()
    是否同样适用?
  3. catch()
    ,
    finally()
    then()
    自己运行 synchronously?

我的3个问题只是为了了解pending status指的是什么

javascript asynchronous promise
1个回答
0
投票

你的理解基本正确。让我们分解一下:

  1. then()、catch() 和 finally() 方法本身是同步执行的,但它们的回调是异步执行的。这就是为什么当这些方法返回时返回的 Promise 最初总是处于 “待定” 状态。
  2. 传递给 then()、catch() 和 finally() 方法的回调被异步调用,因为它们被放入 JavaScript 事件队列,并在 JavaScript 运行时可以处理它们时立即执行。这就是为什么您无法确定这些回调将在何时执行的原因。
  3. finally() 还返回一个 Promise,该 Promise 在执行回调时已解决。如果回调返回一个 Promise,则 finally() 返回的 Promise 在该 Promise 被解决之前不会被解决。 finally() 返回的 Promise 的值与原来的 Promise 相同。如果原始 Promise 解析,则由 finally() 返回的 Promise 解析为相同的值。如果原始 Promise 拒绝,则 finally() 返回的 Promise 也会以同样的原因拒绝。
  4. catch()、finally() 和 then() 本身并不是异步运行的。它们被调用后立即返回,不会阻塞 JavaScript 执行线程。这是他们注册的异步运行的回调。
  5. 需要注意的重要一点是,如果在 then()、catch() 或 finally() 回调中抛出错误,并且未在该回调中捕获,则会导致 Promise 被拒绝。

总的来说,你对这些Promise方法的理解是正确的。它们提供了一种方法来安排回调以响应 Promise 的解决或拒绝而运行,并且它们返回一个允许链接的新 Promise。这些方法返回的 Promise 最初始终处于挂起状态,因为回调是异步运行的。

© www.soinside.com 2019 - 2024. All rights reserved.