在async-pool的代码库中,有这样的语句:
const p = Promise.resolve(iteratorFn(item, iterable));
我相信这个说法相当于:
const p = Promise.resolve().then(() => iteratorFn(item, iterable));
...因为这两个语句都解析了一个 Promise 并异步执行
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 -----------------");