Event loop 浏览器和node

JavaScript解释器会解析js将js中的事件按一定的顺序执行,浏览器通过html规范进行定义,而node用libuv库来实现Event loop。

用两个图直观看浏览器和node在处理上的不同

浏览器:

image

node:

image

在JavaScript中,任务被分为Task(又称为MacroTask,宏任务)和MicroTask(微任务)两种

MacroTask: script(整体代码), setTimeout, setInterval, setImmediate(node独有), I/O, UI rendering
MicroTask: process.nextTick(node独有), Promises, Object.observe(废弃), MutationObserver

浏览器:会先执行同步代码,即script(整体代码),因为script是个宏任务因此会开始读取微任务

微任务并执行,微任务队列空了后,在回任务队列读取下一个宏任务

image

结果:

image

node:node的事件循环与浏览器不同

但依旧是先执行同步代码,接着执行微任务队列里的任务,紧接执行以下阶段的函数

  • timers 阶段:这个阶段执行timer(setTimeoutsetInterval)的回调
  • I/O callbacks 阶段:执行一些系统调用错误,比如网络通信的错误回调 >除了setTimeoutsetIntervalsetImmediate其他的回调函数都在这个阶段执行。
  • idle, prepare 阶段:仅node内部使用
  • poll 阶段:获取新的I/O事件, 适当的条件下node将阻塞在这里
  • check 阶段:执行 setImmediate() 的回调
  • close callbacks 阶段:执行 socketclose 事件回调

每个阶段的函数执行完后,就会去执行微任务的队列,清空微任务队列后才会进入下一个阶段的函数执行 例如:timers 阶段的 setTimeoutsetInterval执行完后会去调用微任务队列中的Promise 执行完后去执行 I/O callbacks 阶段 fs模块中的文件操作等异步操作.

6个阶段吗完成后就算完成一次循环,紧接着进行下次循环

猜你喜欢

转载自www.cnblogs.com/chujunqiao/p/11642811.html