未解决的 promise - 开头返回的 then() 返回的 promise pending

Unresolved promise - Promise pending returned by then() at the beginning

提问人:gus 提问时间:5/17/2023 最后编辑:gus 更新时间:5/17/2023 访问量:141

问:

then():

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

返回值 立即返回新的 Promise。无论当前 promise 的状态如何,此新 promise 在返回时始终处于待处理状态。

catch():

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

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

finally():

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

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

MDN 文档说,返回的 promise 在开始时始终处于待处理状态。then()catch()

据我了解,这是因为这些方法本身是同步执行的,但它们的回调是异步执行的。 这样的回调对于知道 promise 是被解析还是被拒绝是必要的,并且由于这些回调是稍后执行的,因此通过这些方法返回的 promise 将处于未解析状态,因此在执行此类回调之前处于挂起状态。

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

如果承诺已解决或已被“锁定”,则该承诺已解决 以匹配另一个承诺的状态。尝试解决或拒绝 已解决的承诺无效。如果承诺没有解决,则该承诺未解决 解决。未解决的 promise 始终处于待处理状态。一个 已解决的承诺可能处于待处理、履行或拒绝状态。

  1. 据我所知,它正确吗?
  2. 如果按照我的理解是正确的,那么是否同样适用?finally()
  3. 和它们自己同步运行吗?catch()finally()then()

我的 3 个问题只是为了了解待处理状态指的是什么。

JavaScript 异步 承诺

评论

0赞 sinanspd 5/17/2023
回调不会确定是解决还是拒绝 promise。它们根据承诺是否被拒绝或解决来执行。我认为考虑函数调用是否同步执行并不是特别有用。他们所做的大部分工作是一些类型检查和注册回调。所以是的,他们立即完成他们的工作,但最有趣的部分发生在内部通过回调。我建议阅读有关延续传递样式的信息,尤其是堆栈在 CPS 中的演变方式.then
0赞 gus 5/17/2023
嗨,@sinanspd,有必要知道它是否同步。
1赞 Bergi 5/17/2023
"catch()、finally() 和 then() 本身是否同步运行?- 每个函数都同步返回一些东西。即使它启动一些异步后台任务或注册一个处理程序,以便稍后调用。
1赞 gus 5/17/2023
嗨,@Bergi,太好了。那么,这 3 种方法(和 )返回的承诺在一开始就没有解决呢?catch()finally()then()
1赞 Bergi 5/17/2023
@gus 是的,您正确理解了文档

答: 暂无答案