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