`Promise.resolve().then(() => iteratorFn(item, iterable));` === `Promise.resolve(iteratorFn(item, iterable));,` 是真的吗?

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

async-pool pr-link 的代码库中,有一行使用了

const p = Promise.resolve(iteratorFn(item, iterable));
。我相信这种语法相当于
const p = Promise.resolve().then(() => iteratorFn(item, iterable));
,因为这两个语句都解析了一个 Promise 并异步执行
iteratorFn(item, iterable)
。但是,我想确认我的假设是否正确,并了解如何验证它。此外,我希望获得有关编写适当的单元测试以确保此代码的行为的指导。谢谢您的协助!

在检查 async-pool 中的代码时,我遇到了

const p = Promise.resolve().then(() => iteratorFn(item, iterable));
行,我怀疑这段代码相当于
const p = Promise.resolve(iteratorFn(item, iterable));
。有人可以帮助确认我的理解是否正确吗?如果是,我如何验证这一点并编写单元测试?如果没有的话,对于给您带来的不便,我深表歉意。

我已尝试以下故障排除步骤:

  • 检查库是否正确导入并确保版本与文档匹配。
  • 彻底审查了官方文档和代码示例,以确保我正确理解和使用该库的API。
  • 根据社区的建议尝试了不同的参数和配置选项。
javascript github jestjs promise pull-request
1个回答
0
投票

你写道:

这两个语句都解析了一个 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.