我有以下代码:
function myPromiseFunc() {
return new Promise((resolve) => {
resolve(Promise.resolve(123));
});
}
据我们所知Promise.resolve
方法立即使用普通值解析 Promise。所以
Promise.resolve(123) -> Promise<fulfilled>
但:console.log(myPromiseFunc());
将返回状态为 pending
的 Promise .为什么? 解析函数是否传递给执行器异步? 原因如下:setTimeout(console.log, 0, res);
将返回 Promise<fulfilled>
.我知道 Promises 使用微任务,但它应该只用于处理程序。
Promises/A+说:
[[解决]](promise, x) ->
If/when x is a promise and fulfilled, fulfill promise with the same value.
顺便一提。此剪辑将返回 Promise<fulfilled>
:function myPromiseFunc() {
return new Promise((resolve) => {
resolve(123);
});
}
所以它看起来像 resolve
仅当 Promise 作为值传递时才异步。请帮助理解。谢谢!
最佳答案
根据the specification的resolve
在 new Promise((resolve, reject) => ...)
中传递给执行器的函数:
当使用参数 resolution
调用 promise 解析函数时,采取以下步骤:
F
是事件的功能对象。 F
有一个 [[Promise]]
值为 Object 的内部插槽。 promise
是 F.[[Promise]]
. alreadyResolved
是 F.[[AlreadyResolved]]
. alreadyResolved.[[Value]]
是 true
, 返回 undefined
. alreadyResolved.[[Value]]
至true
. SameValue(resolution, promise)
是 true
, 然后selfResolutionError
做个新人TypeError
目的。 RejectPromise(promise, selfResolutionError)
. Type(resolution)
不是对象,那么FulfillPromise(promise, resolution)
. then
是 Get(resolution, "then")
. then
是突然完成,那么RejectPromise(promise, then.[[Value]])
. thenAction
是 then.[[Value]]
. IsCallable(thenAction)
是 false
, 然后FulfillPromise(promise, resolution)
. thenJobCallback
是 HostMakeJobCallback(thenAction)
. job
是 NewPromiseResolveThenableJob(promise, resolution, thenJobCallback)
. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])
. undefined
. 很多技术术语,但对您的问题来说最重要的一点是
resolution
是您传递给它的值。如果它(大致)是一个非 Promise,你最终会出现在 8.1
中。 (对于非对象)或 12.1
(对于不可调用的对象),这将立即履行 promise 。如果你传递了一个带有 then
的值函数(例如 Promise),它将执行从 13
开始的所有步骤它基本上排队.then
并遵循整个“我的实现取决于另一个 Promise 的实现”。
关于javascript - 解析函数是否传递给 Promise 执行器异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68704448/