跳到主要内容

promise JS宏任务微任务的执行顺序

管

管理员

https://segmentfault.com/q/1010000019603603/

2019年07月12日 3,421 次阅读
本页目录

题目描述:JS宏任务微任务的执行顺序为什么是这样的


console.log(1);

setTimeout(() => {
  console.log(2);
  Promise.resolve().then(() => {
    console.log(3)
  });
});

new Promise((resolve, reject) => {
  console.log(4)
  resolve(5)
}).then((data) => {
  console.log(data);
  
  Promise.resolve().then(() => {
    console.log(6)
  }).then(() => {
    console.log(7)
    
    setTimeout(() => {
      console.log(8)
    }, 0);
  });
})

setTimeout(() => {
  console.log(9);
})

console.log(10);

结果: 1 4 10 5 6 7 2 3 9 8

建议先简单了解下JS异步代码的运行原理,包括:

  • 进程与线程
  • JavaScirpt是单线程的
  • 执行栈
  • 浏览器中的 Event Loop

常见的宏任务有:

  • script
  • 定时器:setTimeout,setInterval,setImmediate
  • I/O
  • UI渲染

常见的微任务有:

  • Promise
  • MutationObserver
  • Node中的process.nextTick

回到上述代码,执行顺序如下:

  1. 首先执行同步代码,同步代码包括 console.log,Promise的创建也属于同步代码,打印 1 4 10
  2. 所有的同步代码执行完后,执行栈为空,查询是否有异步代码需要执行
  3. 首先会执行微任务,进入Promise,执行resolve,在第一个then回调中打印出 5
  4. 继续执行微任务,进入两个then回调,打印 6,7
  5. then回调中的setTimeout属于宏任务,会被放到task队列,此时的task队列中有三个宏任务
  6. 所有微任务执行完成后开始执行宏任务,第一个setTimeout打印 2,接下来又遇到微任务,转而执行微任务,打印 3
  7. 接下来执行剩下的两个宏任务,依次打印 9,8

Related

相关文章

同分类文章 →
2025年06月10日 前端

gemini-2.5-pro-0605 按图生成html效果测试

Gemini 最新推出的 2.5 版本真的有点东西。之前用过不少 AI 辅助写代码的工具,但这次它的“图生 HTML”功能确实让我眼前一亮——上传一张设计图,它不仅能快速识别布局和元素,还能生成结构清晰、样

2025年03月14日 前端

css flex-1和overflow-hidden结合使用详解:弹性布局与内容溢出控制

在 Flexbox 布局中,flex: 1 和 overflow: hidden 是两个常用的属性,它们组合使用可以有效地控制子元素的尺寸和内容显示。flex: 1 的作用:当子元素设置 flex: 1 时,它会根据 Flex 容器的主轴方向,自动伸缩以填充剩余的可用

2025年03月13日 前端

Vue 3中实现处理后的v-model双向绑定

在Vue 3中,当你需要对v-model传入的值进行处理后再展示或使用时,可以使用计算属性的getter和setter来实现这种处理过程的双向绑定。 实现步骤 接收父组件传递的v-model值 创建计算属性,在getter中处理展示值,在setter中处

WeChat

扫码加我微信

微信二维码