一,背景
- JS 是单线程执行的语言,可以通过异步任务执行来提高执行效率,也避免了主线程阻塞
- 异步任务利用 Event loop 机制来执行,将需要任务放到堆栈中,在主线程执行完后,再执行堆栈的任务,依次循环下去
二,Event loop
下图是 Event loop 的框架图

- task queue 也称为宏任务,存放的是 setTimeout、setInterval、I/O、UI交互事件、postMessage、MessageChannel、setImmediate(Node.js 环境) 等相关的异步任务
- micro task queue 称为微任务,包括 Promise.then、MutaionObserver、process.nextTick(Node.js 环境)
特别注意
在 Node 中,会优先清空 next tick queue,即通过process.nextTick 注册的函数,再清空 other queue,常见的如Promise;
此外,timers(setTimeout/setInterval) 会优先于 setImmediate 执行,因为前者在 timer 阶段执行,后者在 check 阶段执行。
Leave a Reply