JavaScript解释器会解析js将js中的事件按一定的顺序执行,浏览器通过html规范进行定义,而node用libuv库来实现Event loop。
用两个图直观看浏览器和node在处理上的不同
浏览器:
node:
在JavaScript中,任务被分为Task(又称为MacroTask,宏任务)和MicroTask(微任务)两种
MacroTask: script(整体代码), setTimeout, setInterval, setImmediate(node独有), I/O, UI rendering
MicroTask: process.nextTick(node独有), Promises, Object.observe(废弃), MutationObserver
浏览器:会先执行同步代码,即script(整体代码),因为script是个宏任务因此会开始读取微任务
微任务并执行,微任务队列空了后,在回任务队列读取下一个宏任务
结果:
node:node的事件循环与浏览器不同
但依旧是先执行同步代码,接着执行微任务队列里的任务,紧接执行以下阶段的函数
setTimeout
、setInterval
)的回调
setTimeout
、setInterval
,setImmediate
其他的回调函数都在这个阶段执行。setImmediate()
的回调
socket
的 close
事件回调每个阶段的函数执行完后,就会去执行微任务的队列,清空微任务队列后才会进入下一个阶段的函数执行 例如:timers 阶段的 setTimeout
、setInterval执行完后会去调用微任务队列中的Promise 执行完后去执行 I/O callbacks 阶段 fs模块中的文件操作等异步操作.
6个阶段吗完成后就算完成一次循环,紧接着进行下次循环
原文:https://www.cnblogs.com/chujunqiao/p/11642811.html