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

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

转载于:https://juejin.im/post/5c5505246fb9a049b780cd74

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值