前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >异步 JavaScript 之理解 macrotask 和 microtask

异步 JavaScript 之理解 macrotask 和 microtask

作者头像
挥刀北上
发布2019-08-06 16:22:43
4570
发布2019-08-06 16:22:43
举报
文章被收录于专栏:Node.js开发
先来看一段关于promise的常见面试题,写出数字的打印顺序:
代码语言:javascript
复制
setTimeout(function() {
    console.log(4)
},
0);
new Promise(function(resolve) {
    console.log(1)
    for (var i = 0; i < 10000; i++) {
        i == 9999 && resolve()
    }
    console.log(2)
}).then(function() {
    console.log(5)
});
console.log(3);

在输出结果之前,我们先来了解两个概念 macrotasks 和 microtasks。直译过来就是大型任务和微型任务。在javascript中,这两个任务有什么不同呢?microtasks比macrotasks优先执行。

在V8引擎实现中,任务队列分为 macrotasks 和 microtasks。两个队列各包含不同的任务:

macrotasks: script(整体代码),setTimeout, setInterval, setImmediate, I/O, UI rendering

microtasks: process.nextTick, Promises, Object.observe, MutationObserver。

从列表中可以看出,上述代码中Promise中的then方法中的函数会被推入 microtasks 队列,而setTimeout的任务会被推入 macrotasks 队列。

上述代码在执行过程中遇到了setTimeout,将其回调加入到macrotask queue中, 然后,遇到了promise.then,放入到了另一个队列microtask queue。 等整个主线程执行完后, 就会从microtask queue中取出函数执行,直到microtask queue中的全部任务执行完成,才会执行macrotask queue中的函数。 因此promise.then的回调比setTimeout先执行。

在javascript中,microtask queue会优先于macrotask queue执行。microtask 就相当于头图中的VIP客户,可以随时插队,插入到第一个人和第二个人之间,第一个人相当于正在执行的主线程,而第二个人相当于macrotasks即将要执行的回调。

上面代码的运行结果为:1 2 3 5 4

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档