当前位置: 首页 > news >正文

异步任务执行顺序

异步任务执行顺序

console.log(1);async function foo() {console.log(2);await bar(); // 关键点:await 会暂停 foo 的执行console.log(3); // 被放入微任务队列(在 bar 的 Promise 解决后)
}async function bar() {console.log(4);await Promise.resolve(); // 暂停 bar 的执行console.log(5); // 被放入微任务队列
}setTimeout(() => console.log(6), 0); // 宏任务foo();new Promise(resolve => {console.log(7);resolve();
}).then(() => console.log(8)); // 微任务console.log(9);

执行步骤详解:

  1. 同步代码执行

    • console.log(1) → 输出 1
    • 调用 foo()
      • console.log(2) → 输出 2
      • 调用 bar()
        • console.log(4) → 输出 4
        • await Promise.resolve() 暂停 bar,将 console.log(5) 放入微任务队列
      • await bar() 暂停 foo,将 console.log(3) 标记为等待(但尚未入队)
    • new Promise 同步执行:
      • console.log(7) → 输出 7
      • resolve() → 将 console.log(8) 放入微任务队列
    • console.log(9) → 输出 9
    • 当前输出:1, 2, 4, 7, 9
  2. 微任务队列处理

    • 微任务队列初始内容:[输出5, 输出8]
    • 执行第一个微任务:console.log(5) → 输出 5
      • 关键:此时 bar() 的 Promise 解决,触发 foo() 的等待结束
      • foo() 中的 console.log(3) 被放入微任务队列
    • 执行第二个微任务:console.log(8) → 输出 8
    • 执行第三个微任务:console.log(3) → 输出 3
    • 输出:5, 8, 3
  3. 宏任务队列处理

    • 执行 setTimeout 回调:console.log(6) → 输出 6

最终输出顺序:

1 → 2 → 4 → 7 → 9 → 5 → 8 → 3 → 6

关键机制说明:

  1. await 的双重暂停

    • await bar() 暂停 foo 时,console.log(3) 不会立即入队
    • 必须等待 bar() 的 Promise 解决(即 console.log(5) 执行后),console.log(3) 才加入微任务队列
  2. 微任务执行顺序

    微任务队列初始化
    微任务队列初始化
    触发foo继续
    同步代码
    输出5
    输出8
    输出3
  3. 优先级规则

    • 同步代码 > 已存在的微任务 > 新生成的微任务 > 宏任务
    • 微任务队列按 先进先出 (FIFO) 顺序执行

常见误区:

  • 误认为 await 后的代码会立即入队(实际需等待右侧 Promise 解决)
  • 忽略链式微任务的动态生成(如 console.log(3)console.log(5) 执行后才入队)
  • 混淆微任务和宏任务的优先级(微任务总是优先于宏任务)

你的理解完全正确!这个顺序展示了 JavaScript 事件循环的精细调度机制。

http://www.lryc.cn/news/622049.html

相关文章:

  • DataGear:一个免费开源的国产数据可视化分析平台
  • 经典BT的连接过程
  • 归并排序和统计排序
  • 智能工厂生产监控大屏-vue纯前端静态页面练习
  • AI智能体在软件测试中的应用与未来趋势
  • 开疆智能Ethernet转ModbusTCP网关连接测联无纸记录仪配置案例
  • python-pycharm切换python各种版本的环境与安装python各种版本的环境(pypi轮子下载)
  • C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏
  • SAP ALV导出excel 报 XML 错误的 /xl/sharedStrings.xml
  • 2025.08.09 江门两日游记
  • 4.2 寻址方式 (答案见原书 P341)
  • LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。
  • 硬件实现webrtc的编解码
  • 从前端框架到GIS开发系列课程(26)在mapbox中实现地球自转效果,并添加点击事件增强地图交互性
  • 【自动化运维神器Ansible】Ansible算术运算符详解:实现配置文件的动态计算
  • MS5905P 一款 12bit 分辨率的旋变数字转换器
  • GaussDB 常用数值类型
  • 在Ubuntu 22.04上安装远程桌面服务
  • C语言指针(五):回调函数与 qsort 的深层关联
  • 【大模型微调系列-03】 大模型数学基础直观入门
  • Codeforces Deque工艺
  • 专题三_二分_x 的平方根
  • Swift 实战:用最长递增子序列算法解“俄罗斯套娃信封”问题(LeetCode 354)
  • Effective C++ 条款42:了解 typename 的双重含义
  • 旅游管理实训室:旅游教育实践育人的关键支撑
  • spring中异步任务注解@Async和@scheduled的使用
  • 5G赋能井下“毛细血管”:巴拉素煤矿零散排水点智能监控系统
  • 基于阿里云音频识别模型的网页语音识别系统实现
  • Spring WebFlux 性能优化实践指南
  • 近日算法备案事项:九月批复审即将启动/赶11月批最后安全启动时间已过