javascript - 当循环在异步函数内部而不是相反时,为什么 Async/Await 可以正常工作?

标签 javascript async-await es6-promise

我有三个片段,在 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();
 }

关于javascript - 当循环在异步函数内部而不是相反时,为什么 Async/Await 可以正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55323666/

相关文章:

javascript - 检查前一行值并相应地显示下一行

javascript - 使用underscorejs进行多维排序

javascript - 为什么 es6 react 组件仅适用于 "export default"?

javascript - 如何返回许多 Promise 并在做其他事情之前等待它们全部

javascript - 我的 ES6 类方法是否应该返回一个 Promise,即使没有必要?

javascript - 使用 AJAX 和 PHP 保存用户的照片

c# - await Task.CompletedTask 是为了什么?

c# - 异步下载期间 C# WPF 应用程序中的 UI 线程被阻塞

javascript - await 是 async 函数内部的保留字错误

javascript - Promise 中的 request.post 方法跳出