看明白两个案例,秒懂事件循环

事件循环的任务队列包括宏任务 和微任务

执行顺序就是:同步代码 -> 第一轮微任务 -> 第一轮宏任务 -> 第二轮微任务 ->...

宏任务有:setTimeout , setInterval , setImmediate, I/O, UI rendering。

微任务有:process.nextTick , Promise, Object.observe(已废弃), MutationObserver(html5新特性)

两大原则:

  1. setTimeout和setInterval同源,且均优先于setImmediate执行
  2. nextTick队列会比Promie.then方法里面的代码先执行

简单案例

js 复制代码
setTimeout(function() {
    console.log('timeout1'); // 5-第一轮宏任务
})

new Promise(function(resolve) {
    console.log('promise1'); // 1-同步代码
    for(var i = 0; i < 1000; i++) {
        i == 99 && resolve();
    }
    console.log('promise2'); // 2-同步代码
}).then(function() {
    console.log('then1'); // 4-第一轮微任务
})

console.log('global1'); // 3-同步代码


/*
promise1
promise2
global1
then1
timeout1
*/

综合案例

js 复制代码
console.log('golb1'); // 1-同步代码

setTimeout(function() {
    console.log('timeout1'); // 3.1-第一轮宏任务
    process.nextTick(function() {
        console.log('timeout1_nextTick'); // 3.3-第二轮微任务
    })
    new Promise(function(resolve) {
        console.log('timeout1_promise'); // 3.2-第一轮宏任务
        resolve();
    }).then(function() {
        console.log('timeout1_then') // 3.4-第二轮微任务
    })
})

setImmediate(function() {
    console.log('immediate1'); // 3.1-第一轮宏任务
    process.nextTick(function() {
        console.log('immediate1_nextTick'); // 3.3-第二轮微任务
    })
    new Promise(function(resolve) {
        console.log('immediate1_promise'); // 3.2-第一轮宏任务
        resolve();
    }).then(function() {
        console.log('immediate1_then') // 3.4-第二轮微任务
    })
})

process.nextTick(function() {
    console.log('glob1_nextTick');// 2.1-第一轮微任务
})
new Promise(function(resolve) {
    console.log('glob1_promise');// 1-同步代码
    resolve();
}).then(function() {
    console.log('glob1_then') // 2.2-第一轮微任务
})

setTimeout(function() {
    console.log('timeout2'); // 3.1-第一轮宏任务
    process.nextTick(function() {
        console.log('timeout2_nextTick'); // 3.3-第二轮微任务
    })
    new Promise(function(resolve) {
        console.log('timeout2_promise'); // 3.2-第一轮宏任务
        resolve();
    }).then(function() {
        console.log('timeout2_then') // 3.4-第二轮微任务
    })
})

process.nextTick(function() {
    console.log('glob2_nextTick');// 2.1-第一轮微任务
})
new Promise(function(resolve) {
    console.log('glob2_promise');// 1-同步代码
    resolve();
}).then(function() {
    console.log('glob2_then')// 2.2-第一轮微任务
})

setImmediate(function() {
    console.log('immediate2'); // 3.1-第一轮宏任务
    process.nextTick(function() {
        console.log('immediate2_nextTick'); // 3.3-第二轮微任务
    })
    new Promise(function(resolve) {
        console.log('immediate2_promise'); // 3.2-第一轮宏任务
        resolve();
    }).then(function() {
        console.log('immediate2_then') // 3.4-第二轮微任务
    })
})

/*
(1-同步代码)
golb1
glob1_promise
glob2_promise
(2-第一轮微任务)
glob1_nextTick
glob2_nextTick
glob1_then
glob2_then
(3-第一轮宏任务)
(setTimeout)
timeout1
timeout1_promise
timeout1_nextTick
timeout1_then
timeout2
timeout2_promise
timeout2_nextTick
timeout2_then
(setImmediate)
immediate1
immediate1_promise
immediate1_nextTick
immediate1_then
immediate2
immediate2_promise
immediate2_nextTick
immediate2_then
*/

注:在Node 11前,Node的事件循环会与浏览器存在差异,以上面案例中的两个setTimeout为例:

js 复制代码
//在Node 11前
timeout1
timeout1_promise
timeout2
timeout2_promise
timeout1_nextTick
timeout2_nextTick
timeout1_then
timeout2_then
// 在Node11后和浏览器
timeout1
timeout1_promise
timeout1_nextTick
timeout1_then
timeout2
timeout2_promise
timeout2_nextTick
timeout2_then

即在同一类任务分发器(如:多个setTimeout),在Node 11前,会先执行所有的nextTick,再到Promise.then;而在Node11后和浏览器,都是依次执行每个setTimeout,在同一个setTimeout里面先执行所有nextTick,再到Promise.then。

Refs:

mp.weixin.qq.com/s/m3a6vjp8-...

相关推荐
沙漠之主10 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
hasty10 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
Csvn10 小时前
diff 算法(虚拟 DOM Reconciliation)
前端
前端snow11 小时前
ai agent --- 文件存储
前端
Frag0ut11 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
IT大白鼠12 小时前
搜索系列 · 第 08 篇——面试收官:高频题与全景总结
elasticsearch·面试·nosql
IT_陈寒13 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技13 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错13 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端
Latchh13 小时前
前端导出的JPEG红字发糊,质量要拉到100才清楚
前端·图像处理·人工智能·计算机视觉