Javascript 异步/等待嵌套是否会影响性能? 让我们考虑我们有N个异步函数,如: async function1(){ return await fetch(...); } . . . async functionN(){ return await fetch(...); }

Javascript 异步/等待嵌套是否会影响性能? 让我们考虑我们有N个异步函数,如: async function1(){ return await fetch(...); } . . . async functionN(){ return await fetch(...); },javascript,async-await,Javascript,Async Await,然后我们有一个函数,如: async wrapper(){ let var = await fetch(...); function1(); . . . functionN(); } 这是否会创建一个大的微任务队列,从而在所有调用函数解决其等待之前有效阻止ui线程进入下一个任务?在承诺解决之前,微任务队列中没有任何内容。在此之前,可以处理其他任务和UI事件 这是因为wait操作符将使相应的异步函数立即返回,从而允许执行其他JS代码。在您的情况下,承诺是由fe

然后我们有一个函数,如:

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

这是否会创建一个大的微任务队列,从而在所有调用函数解决其等待之前有效阻止ui线程进入下一个任务?

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

这是因为wait操作符将使相应的异步函数立即返回,从而允许执行其他JS代码。在您的情况下,承诺是由fetch返回的,这在实践中不会立即解决。所以这里没有阻塞

然后,当HTTP响应解析fetch承诺时,将确实创建一个微任务,当执行该任务时,将恢复相应异步函数的执行上下文。您的示例函数没有其他事情要做,因此可以很快完成

请注意,此函数最初是否从其他函数中调用并不重要:在这一阶段,仅恢复该函数的执行上下文,在该上下文中已解析等待的承诺,而不恢复任何预先存在的调用堆栈。因此,它不会再次返回包装函数。这在第一阶段已经发生,以后不会再发生


然后,在下一个获取承诺解决之前,仍然有空闲事件处理。所以它还在继续。

我不明白你在这里筑巢是什么意思。您不是故意等待functionN调用的吗?只有一个微任务队列,它存在于运行时中,代码之外。它不是被创建的。是的,它是故意的。这是一种“火”和“忘”…但我实际上在质疑,这是真的忘了还是在一个巨大的微任务队列和阻塞的ui上记住了它?@Bergi我知道在我的代码之外只有一个微任务队列:。正确的措辞应该是:上面的代码是否会在微任务队列中创建许多微任务,这些任务计划在新任务之前执行?谢谢您的详细回答。最后一部分特别有用!