- js引擎对异步代码优先级进行划分:微任务、宏任务。
- 微任务:
process.nextTick 只有nodejs有
queueMicrotask将函数添加到微任务队列
promise.then().catch().finally() 成功失败都会触发finally()中的回调,pending是不会触发的。
微任务优先级:process.nextTick优先级最高 ,其他微任务按顺序执行。 - 宏任务:
setTimeout
setInterval
setImmediate
requestAnimationFrame
宏任务优先级:看nodejs事件轮询机制。
timers 定时器阶段:定时器队列,里面有定时器的回调函数
pending callbacks待定回调
idle, prepare
poll 轮询阶段:轮询队列,里面有I/O操作的回调函数
首先依次执行轮询队列中的回调函数。直到全部执行完毕。轮询队列为空。再看之前有没有设置过setImmediate函数或者定时器有没有到点, 满足以上两个条件之一,就会去下一个check阶段。不满足条件,就会在当前阶段一直停留,不去下一个阶段了。
check 检测阶段:检测队列,里面有setImmediate回调函数
close callbacks关闭的回调函数
注意:定时器阶段和检测阶段,如果定时器有延时1s,那就是检测阶段先执行。 - 总之:微任务优先级高,宏任务优先级低。
先执行微任务,执行完所有微任务,再检查宏任务执行。当执行完一个宏任务,继续检查微任务,如果有就执行,没有就执行下一个宏任务。
异步代码执行顺序:
最新推荐文章于 2023-11-20 16:00:25 发布