javascript - async/await 嵌套是否会对性能产生影响?
问题描述
让我们考虑一下我们有 N 个异步函数,例如:
async function1(){
return await fetch(...);
}
.
.
.
async functionN(){
return await fetch(...);
}
然后我们有一个类似的功能:
async wrapper(){
let var = await fetch(...);
function1();
.
.
.
functionN();
}
这会创建一个大的微任务队列,在所有被调用的函数解决它们之前有效地阻止 ui 线程进入下一个任务awaits
吗?
解决方案
在 promise解决之前,微任务队列中没有任何内容。在此之前,可以处理其他任务和 (UI) 事件。
这是因为await
操作符会让对应的async
函数立即返回,让其他JS代码执行。在您的情况下,承诺由返回fetch
,实际上不会立即解决。所以这里没有什么阻碍。
然后,当 HTTP 响应使fetch
promise 解析时,确实会创建一个微任务,执行时会恢复相应async
函数的执行上下文。您的示例函数无事可做,因此很快就完成了。
请注意,这个函数是否最初是从某个其他函数中调用的并不重要:在这个阶段,只有那个特定函数的执行上下文(在其中解决了一个等待的承诺)在没有任何预先存在的调用堆栈的情况下被恢复。所以它不会再次返回到包装函数。这在第一阶段已经发生,并且不会再发生。
然后再次有免费的事件处理,直到下一个fetch
承诺解决。所以它继续。
推荐阅读
- ios - 在 MacOS 上公开 safaridriver 以用作 Window 机器的 RemoteWebDriver
- mysql - Heroku 日志说 ReferenceError: PORT is not defined
- kubernetes - 未找到 k8s ExternalName 端点 - 但正在工作
- python - 在python中填充空单元格(从excel导入数据集)
- javascript - 当使网站响应时,我希望我的一些文字消失!请帮助
- python - Python如何检查熊猫中的DataFrame列是否包含范围内的所有数字
- javascript - 为什么 Instagram API 会为同一个用户返回两个不同的 user_id 值?
- accessibility - 有没有办法查看 Marketing Cloud 电子邮件符合哪些可访问性标准?
- flutter - 在 ListView 构建器中实现搜索
- java - 如何在 Java 16 中删除 --enable-preview?