首页 > 解决方案 > async/await 嵌套是否会对性能产生影响?

问题描述

让我们考虑一下我们有 N 个异步函数,例如:

async function1(){
  return await fetch(...);
}
.
.
.
async functionN(){
  return await fetch(...);
}

然后我们有一个类似的功能:

async wrapper(){
   let var = await fetch(...);
   function1();
   .
   .
   .
   functionN();
}

这会创建一个大的微任务队列,在所有被调用的函数解决它们之前有效地阻止 ui 线程进入下一个任务awaits吗?

标签: javascriptasync-await

解决方案


在 promise解决之前,微任务队列中没有任何内容。在此之前,可以处理其他任务和 (UI) 事件。

这是因为await操作符会让对应的async函数立即返回,让其他JS代码执行。在您的情况下,承诺由返回fetch,实际上不会立即解决。所以这里没有什么阻碍。

然后,当 HTTP 响应使fetchpromise 解析时,确实会创建一个微任务,执行时会恢复相应async函数的执行上下文。您的示例函数无事可做,因此很快就完成了。

请注意,这个函数是否最初是从某个其他函数中调用的并不重要:在这个阶段,只有那个特定函数的执行上下文(在其中解决了一个等待的承诺)在没有任何预先存在的调用堆栈的情况下被恢复。所以它不会再次返回到包装函数。这在第一阶段已经发生,并且不会再发生。

然后再次有免费的事件处理,直到下一个fetch承诺解决。所以它继续。


推荐阅读