Event Loop例子

事件循环:macrotask与microtask

JS的执行机制如图:


JS的执行机制

分析一道执行顺序的例子

console.log('1');
setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})
setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
}
  • 第一次事件循环流程:
  1. 进入主线程,console.log(1)
  2. setTimeout异步执行,将其回调函数放入Event Queue中,记为setTimeout1
  3. process.nextTick(),将其回调函数存入微任务队列中,记为process1
  4. Promise,new Promise()会立即执行console.log(7),then被存入微任务队列中m
  5. setTimeout,其回调函数存入宏任务事件队列中,记为setTimeout2

第一轮事件循环输出结果1,7,6,8

  • 第二轮事件循环从setTimeout1开始
  1. console.log(2)
  2. process.nextTick() 存入微任务中,记为process2.
    3 new Promise()立即执行输出4,then也存入到微任务队列中,记为promise2

第二轮事件循环结束,第二轮输出2,4,3,5
第三轮事件循环开始,只剩setTimeout2了,类似于setTimeout1执行,结果输出为9,11,10,12
整段代码,共进行了三次事件循环,完整的输出为1,7,6,8,2,4,3,5,9,11,10,12。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,859评论 0 5
  • 静下心学了一波事件循环机制,好开心,我学会了,首先还是得感谢作者写的笔记特别详细 链接: http://www.c...
    Dianaou阅读 616评论 0 0
  • [图片上传失败...(image-c3e3cb-1516440392143)] 一,js单线程存在的问题 js是单...
    奉献_97a8阅读 777评论 0 1
  • event loop 浏览器内核是多线程,Javascript是单线程。 楼主之前讲解了js的异步处理,只是讲解了...
    sunny519111阅读 7,269评论 4 20
  • 一.js是一门单线程的语言,js是按照语句出现的顺序执行的 二.Javascript事件循环 因为js是单线程,所...
    lmmy123阅读 374评论 0 0

友情链接更多精彩内容