我在await
上对promise
进行编码时,有三个片段循环了三次。
在第一个代码段中,它按我的预期工作,并且i
的值随每个await
递减。
let i = 3;
(async () => {
while (i) {
await Promise.resolve();
console.log(i);
i--;
}
})();
输出:
3
2
1
在第二个中,
i
的值连续递减,直到达到零,然后执行所有await
。let i = 3;
while (i) {
(async () => {
await Promise.resolve();
console.log(i);
})();
i--;
}
输出:
0
0
0
最后,这导致
Allocation failed - JavaScript heap out of memory
错误,并且不打印任何值。let i = 3;
while (i) {
(async () => {
await Promise.resolve();
console.log(i);
i--;
})();
}
有人可以解释为什么他们表现出这些不同的行为吗?谢谢。
最佳答案
关于第二个片段:
在不等待结果的情况下调用异步函数的方法称为即发即弃。您告诉JavaScript它应该开始一些异步处理,但是您不在乎它何时以及如何完成。就是这样它循环,触发一些异步任务,当循环完成时它们会在完成时返回,并且在循环已经结束时将记录为0。如果您愿意:
await (async () => {
await Promise.resolve();
console.log(i);
})();
它将按顺序循环。
关于您的第三个片段:
您永远不会在循环中减少
i
,因此循环将永远运行。如果异步任务在某个时间执行,它将减少i
,但是这不会发生,因为while循环会疯狂运行并阻塞浏览器并使之崩溃。 let i = 3;
while(i > 0) {
doStuff();
}