搞清async await、微任务,宏任务执行顺序

宏任务

1.script(整体代码)

2.setTimeout

3.setInterval

4.I/O

5.UI交互事件

6.postMessage

7.MessageChannel

8.setImmediate(Node.js 环境)

微任务

1. Promise.then

  1. MutaionObserver

  2. process.nextTick(Node.js 环境)

一道面试题,帮助搞清async await、微任务,宏任务执行顺序问题

注:小圆圈序号是代码输出的顺序。

async function async1() {
  console.log('async1 start')//②执行同步代码2,输出
  await async2()             //同步代码3,阻塞下面代码,放入微任务队列
  console.log('async1 end')  //⑥微任务1
}

async function async2() {
  console.log('async2')     //③执行同步代码3,输出
}

console.log('script start')//①同步代码1,输出

setTimeout(() => {//下一个宏任务,放着
  console.log('setTimeout')//⑧
}, 0);     

async1()                   //同步代码2

new Promise(resolve => {
    console.log('promise1')//④同步代码4,输出
    resolve()              //改变promise状态,将promise.then放入微任务队列
  })
  .then(() => {
    console.log('promise2')//⑦微任务2,执行完所有微任务,进入下一轮宏任务,也就是定时器
  })

console.log('script end')  //⑤同步代码5,完成所有同步代码,去执行本轮所有微任务,也就是微任务1和2

解析:

  • 将整个script代码看作第一个宏任务,从上往下,script start是第一个同步代码,输出,碰到定时器,他是一个宏任务,得等本次宏任务执行完才能执行;
  • 遇到第二个同步代码async1(),输出里面的async1 start,此时碰到await,将下面要输出async1 end的代码放入微任务队列,记作微任务1,执行第三个同步任务async2(),输出async2;
  • 往下new promise,是同步任务,输出promise1,resolve()改变promise状态,将promise.then放入微任务队列里,记作微任务2;
  • 最后一行,同步代码,输出script end;
  • 本轮宏任务执行完所有同步代码,去执行本轮所有微任务,也就是微任务1和2,输出async1 end,promise2;
  • 进入下一轮宏任务,也就是定时器,输出setTimeout;
全部评论

相关推荐

2024-12-04 19:53
已编辑
湖南文理学院 产品经理
牛客224543458号:他想找牛马,愿意疯狂加班的,因为要证明自己
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2024-12-18 15:35
程序员牛肉:完全是在胡写简历。 我很好奇你干嘛要在教育经历里面写你是软件二班的班长?你写它的目的是什么?我觉得真的就是很突兀。给我第一感觉就是:你真的是一个心智健全的成年人吗? 另外我也很好奇你是怎么做到参加了这么多所谓的计算机比赛,完事儿一个拿得出手的项目都没有。 自己的项目经历还是图书馆管理系统这种垃圾东西……我的的建议是你都不如大幅度删减一下自己的水奖项,看着真的给人一种又水又学傻了的感觉。 计算机不看奖项,看院校和个人能力。 计算机是强工科,你要投后端的你就应该明白,人家招你进去是指望你干活儿的。那你觉得你这份简历有展示出你的后端水平吗? 你动动你的脑子想一想,人家面试官要想通过你的简历看出你的项目开发能力,最重要的板块就是两个,第一个是你的实习,第二个是你的项目。你没有实习,是不是就应该在项目上好好琢磨琢磨? 你自己看看你项目写的什么描述,你作为一个要后端岗位的应届生,你对你自己项目的描述还仅仅停留在使用mySQL,使用JAVA,使用spring boot框架。给人一眼感觉就感觉完全就是你做的玩具。可能就是你哪一个学期做的课设。 对于应届生来讲,在项目板块要尽量突出自己的技术能力,因为谈业务你肯定也不懂。简单来讲,你的项目要清晰准确的表达:你用哪种技术解决了现有的哪种技术问题,带来了多少的效益提升? 所有关于项目的描述都围绕我说的这种表达方式去写。不要自己自嗨式的写一堆垃圾上去 你既没有实习项目,又没有一个比较好一点的项目,而且院校也比较差,所以找工作会异常的难找。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务