JS事件循环不是JS自身的机制,而是宿主提供的环境机制,JS可以运行在浏览器环境下(V8等JS引擎)或者 nodejs 环境下,通常我们讨论事件循环都是浏览器事件循环,但是在Node领域,事件循环是另一套规则
为了对比学习,我这里放一张 浏览器多线程架构的图,大家可以对比Nodejs环境下和浏览器环境下的事件循环。
值得一提的是,nodejs的事件循环在设计上在逐步的与浏览器的设计方式靠拢。
事件循环阶段
- timers 宿主环境发起的定时器回调
- pendingCallback 操作系统相关的回调函数,比如监听端口
- idle,prepare 系统内部使用,不做讨论
- poll I/O 阶段 当前check 和 timer队列为空的时候会等待一段时间
- check setImmediate回调
- closeCallback 关闭和清除相关的回调
微任务和宏任务
微任务在事件循环的每一个阶段前执行,当前事件循环阶段产生的微任务在下一个间隙执行,微任务产生的微任务在当前间隙执行,微任务和宏任务穿插执行
宏任务
- setlnterval - timers
- setimeout - timers
- I/O - poll
- setlmmediate - check
微任务
- Promise.then
- Promise.catch
- Promise.finally
- process.nextTick
process.nextTick
process.nextTick 是优先级最高的微任务,他的设计目的是让程序能够在IO之间做一些计算,比如在发送HTTP请求的同时发送做一些CPU密集型操作,每一个事件循环阶段之间都能够穿插nextTick
应用:
- 处理竞态追踪问题,在当前请求完成后马上执行某些操作
- 在模块加载完毕之后马上执行某些操作
- 在错误处理之后马上执行某些操作
- 阻塞IO操作,穿插计算过程等