node.js事件循环-js代码在引擎里的解析执行顺序

278 阅读1分钟

1.小栗子

process.nextTick(() => {
    console.log("1");
})
process.nextTick(() => {
    console.log("2");
})
setImmediate(() => {
    console.log("3");
    process.nextTick(() => {
        console.log("4");
    })
})

setImmediate(() => {
    console.log("5");
})
console.log("6");
setTimeout(function () {
    console.log("8");
},0);
process.nextTick(() => {
    console.log("7");
})
//执行结果: 6 1 2 7 8 3 5 4
Promise.resolve("1").then(res => console.log(res));
process.nextTick(() => {
    console.log("2");
})
setTimeout(function () {
    console.log("3");
},0);
console.log("4");

//执行结果: 4 2 1 3

所有的js代码都是同步的,包括ajax,真正异步的是他们回调,所以是事件驱动

node.js把所有的行为都抽象成为了事件,包括客户端发起的请求,node.js会把所有的行为都包装成一个对象,这个对象又分为两个事件队列,利用事件循环来处理这个对象,node.js代码在执行的时候相当于会首先创建个while(true)无限循环,

事件队列:

macro-task:script(全部代码) >定时器(setInterval,setTimeout)>setImmediate I/O

micro-task:process.nextTick>Promise.then

while(true){
    第一步:执行script(全部代码)
    第二部:把所有的`micro-task`全部执行完,清空掉
}

事件循环while并不是直接去事件队列去查找事件,而是通过事件观察者来知道有没有事件需要去处理,

graph LR
macroTask-->while
while-->microTask

事件观察者有-->dle观察者

dle观察者--> I/O事件观察者
I/O事件观察者 -->check观察者

优先级:process.nextTick>Promise.then>setTimeout>setImmediate