javascript - 调用自身的异步函数

标签 javascript async-await

当您有需要按顺序完成的事情列表时,让异步函数调用自身是个好主意吗?

例子:

async continueWork(){

   if(!this.list.length)
     return;

   var next = this.list.shift();

   // do things with next

   await this.continueWork();
}

如果列表非常大怎么办?它会引起问题吗?

最佳答案

是的,这可能会导致问题。每个 continueWork 调用都被放入调用堆栈,在最后一个 continueWork 之上,这可能导致溢出:

let i = 0;
async function continueWork() {
  i++;
  if (i < 1e5) {
    await continueWork();
  }
}

continueWork()
  .then(() => console.log('ok'))
  .catch((err) => {
    console.log('err');
    console.log(err.stack);
  });

您可以通过在 continueWork 递归调用自身之前 awaiting 一些东西来修复它,这样调用堆栈就不会堆积起来:

let i = 0;
async function continueWork() {
  i++;
  await Promise.resolve();
  if (i < 1e5) {
    await continueWork();
  }
}

continueWork()
  .then(() => console.log('ok'))
  .catch((err) => {
    console.log('err');
    console.log(err.stack);
  });

重要的是确保在调用堆栈清空之前没有大量的同步 函数调用。 await(或 .then)确保 await.then 回调之后的内容在microtask(仅在调用堆栈清除后才会发生)。

关于javascript - 调用自身的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58349360/

相关文章:

javascript - 如何用水平滚动修复表头?

javascript - 如何在pubnub发布和订阅方法中显示实时时钟

flutter - Dart/Flutter:如何从异步函数返回小部件?

javascript - 从异步函数返回的 promise 中获取值(value)

javascript - Javascript/Jquery 的范围是什么?

javascript - 加载后如何在网站背景中绘制网格线?

javascript - AngularJS:如何根据条件检查选择 state.go 中的 url?

c# - 如何停止等待任务但让任务在后台运行?

javascript - 使用 forEach 和 async/await,对于 Node 和 Jest 的行为不同

javascript - 如何使用多个异步/等待功能?