我在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();
 }

10-05 21:01
查看更多