Nat*_*aia 5 javascript node.js promise
我有以下代码:
function myPromiseFunc() {
return new Promise((resolve) => {
resolve(Promise.resolve(123));
});
}
Run Code Online (Sandbox Code Playgroud)
正如我们所知,Promise.resolve方法立即用普通值解析 Promise。所以Promise.resolve(123) -> Promise<fulfilled>
但是:
console.log(myPromiseFunc());
Run Code Online (Sandbox Code Playgroud)
将返回带有 status 的 Promise pending。为什么?解析函数是否异步传递给执行器?导致这个:
setTimeout(console.log, 0, res);
Run Code Online (Sandbox Code Playgroud)
将返回Promise<fulfilled>。
我知道 Promise 使用微任务,但它应该只用于处理程序。
承诺/A+说:
[[解决]](承诺, 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);
});
}
Run Code Online (Sandbox Code Playgroud)
所以看起来resolve只有当 Promise 作为值传递时才是异步的。
请大家帮忙理解一下。谢谢你!
根据传递给执行器的函数的规范:resolvenew Promise((resolve, reject) => ...)
当使用参数调用 Promise 解析函数时resolution,将执行以下步骤:
F为活动函数对象。F有一个[[Promise]]内部槽,其值为一个对象。promise这样吧F.[[Promise]]。alreadyResolved这样吧F.[[AlreadyResolved]]。alreadyResolved.[[Value]]是true,则返回undefined。alreadyResolved.[[Value]]trueSameValue(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(对于丢失或不可调用的then字段),这都将立即履行承诺。如果您使用函数(例如 Promise)传递一个值,它将执行从基本上排队的位置then开始的所有步骤,并遵循整个“我的实现取决于另一个 Promise 的实现”。13.then