`Promise.resolve().then(f)`等价于`Promise.resolve(f())`吗?

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

async-pool的代码库中,有这样的语句:

const p = Promise.resolve(iteratorFn(item, iterable));

我相信这个说法相当于:

const p = Promise.resolve().then(() => iteratorFn(item, iterable));

...因为这两个语句都解析了一个 Promise 并异步执行

iteratorFn(item, iterable)

我想确认我的假设是否正确,并了解如何验证它。然后我会编写适当的单元测试来确保此代码的行为。

javascript github jestjs promise pull-request
1个回答
2
投票

你写道:

这两个语句都解析了一个 Promise 并异步执行

iteratorFn(item, iterable)

这不是真的。原代码:

const p = Promise.resolve(iteratorFn(item, iterable)); 

...同步执行

iteratorFn
。换句话说,首先执行
iteratorFn
,然后执行
resolve
,然后为
p
分配已解决的 Promise。

在这里:

 const p = Promise.resolve().then(() => iteratorFn(item, iterable));
首先调用

resolve
,然后调用
then
,然后将待处理的(!)承诺分配给
p
。然后代码将继续同步执行下一条语句。当引擎处理其微任务队列时,即在调用堆栈为空之后,将调用已传递给
then()
的回调。然后
iteratorFn
将被执行,这将解决承诺
p

我们可以在这段代码中看到行为上的差异:

function iteratorFn(arg) {
    console.log("running iteratorFn with argument " + arg);
}

console.log("executing original code");
const p = Promise.resolve(iteratorFn("p")); 
console.log("p has been assigned");

console.log("executing customised code");
const q = Promise.resolve().then(() => iteratorFn("q")); 
console.log("q has been assigned");
console.log("------------- end of synchronous code -----------------");

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