浏览器环境下js和node环境下事件循环机制

 

浏览器环境下js引擎的事件循环机制

 
执行顺序: 主线程》微任务》宏任务
 
 

node环境下事件循环机制

执行原理:
引擎将JS代码分析后----》调用chrome v8引擎(解释器)-----》调用对应node api(api由libuv引擎驱动)—》放入队列----》执行
 
事件循环的顺序:
外部输入数据-->轮询阶段(poll)-->检查阶段(check)-->关闭事件回调阶段(close callback)-->定时器检测阶段(timer)-->I/O事件回调阶段(I/O callbacks)-->闲置阶段(idle, prepare)-->轮询阶段...
 
这些阶段大致的功能如下:
·       timers: 这个阶段执行定时器队列中的回调如 setTimeout() 和 setInterval()。
·       I/O callbacks: 这个阶段执行几乎所有的回调。但是不包括close事件,定时器和setImmediate()的回调。
·       idle, prepare: 这个阶段仅在内部使用,可以不必理会。
·       poll: 等待新的I/O事件,node在一些特殊情况下会阻塞在这里。
·       check: setImmediate()的回调会在这个阶段执行。
·       close callbacks: 例如socket.on('close', ...)这种close事件的回调。
 
1.poll流程
 
poll停止条件:
回调执行完毕/执行数量大于node限制
 
check阶段:
poll空闲---》执行 setImmediate 队列中 setImmediate()方法的回调
 
close阶段:
socket连接/handle关闭(socket.destroy()方法)---》执行close阶段
 
 

process.nextTick setTimeout setImmediate区别

process.nextTick():nextTick队列
 
事件循环进入下一个阶段前检查有nextTick队列---》清空队列(清空后操作才会停止,错误运用可能会造成死循环,直至内存泄漏)
 
setTimeout setImmediate
1.setTimeout(()=>{},0) == setImmediate(()=>{}),但无法确定先后顺序
setTimeout:4ms延时
setImmediate:在poll阶段之后执行
注意:
在I/O事件的回调中,setImmediate方法的回调永远在timer的回调前执行。
 
 

posted @ 2018-03-27 15:29  loioce  阅读(89)  评论(0)    收藏  举报