在 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));
。有人可以帮助确认我的理解是否正确吗?如果是,我如何验证这一点并编写单元测试?如果没有的话,对于给您带来的不便,我深表歉意。
我已尝试以下故障排除步骤:
你写道:
这两个语句都解析了一个 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 -----------------");