让前端飞WEB前端程序开发node

process.nextTick 与 setImmediate

2018-12-01  本文已影响3人  gzgogo

首先纠正朴老师《深入浅出nodejs》一书中的一处错误,内容如下:


image.png

repl.it中实际测试代码和结果如下:

image.png

首先我们先来说一下tick是什么:
简单来说,在node.js启动时,创建了一个类似while(true)的循环体,每次执行一次循环体称为一次tick,每个tick的过程就是查看是否有事件等待处理,如果有,则取出事件极其相关的回调函数并执行,然后执行下一次tick
所以同一个tick里的

下面解释一下上面两个方法:

定义上看两者好像并无区别,但是process.nextTick的执行却优先于setImmediate,原因在于他们采用的观察者不同,process.nextTick()采用的是idle观察者,而setImmediate采用的是check观察者,setTimeout采用的是类似IO观察者。

三种观察者的优先级顺序是:idle观察者 > io观察者 > check观察者

同一个tick里的process.nextTick被优先执行,其次才是setImmediatesetImmediate回调中的process.nextTick属于下一次tick,因此“强势插入”最后才输出。

image.png

最后补充一点,无论node,还是浏览器,js都运行在单线程环境中,只有node的异步IO运行在线程池中,当某个事件执行密集计算阻塞住事件循环时,如while(true) {},浏览器会停止响应,node也会被卡死。

参考

  1. 详解 setTimeout、setImmediate、process.nextTick 的区别
  2. Process.nextTick 和 setImmediate 的区别?
  3. Node.js 事件循环,定时器和 process.nextTick()
上一篇 下一篇

猜你喜欢

热点阅读