首先纠正朴老师《深入浅出nodejs》一书中的一处错误,内容如下:
在repl.it中实际测试代码和结果如下:
首先我们先来说一下tick
是什么:
简单来说,在node.js启动时,创建了一个类似while(true)的循环体,每次执行一次循环体称为一次tick
,每个tick
的过程就是查看是否有事件等待处理,如果有,则取出事件极其相关的回调函数并执行,然后执行下一次tick
。
所以同一个tick里的
下面解释一下上面两个方法:
-
setImmediate
:该方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数 -
process.nextTick
: 定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行
定义上看两者好像并无区别,但是process.nextTick
的执行却优先于setImmediate
,原因在于他们采用的观察者不同,process.nextTick()
采用的是idle
观察者,而setImmediate
采用的是check
观察者,setTimeout
采用的是类似IO
观察者。
三种观察者的优先级顺序是:idle观察者 > io观察者 > check观察者
同一个tick
里的process.nextTick
被优先执行,其次才是setImmediate
,setImmediate
回调中的process.nextTick
属于下一次tick
,因此“强势插入”最后才输出。
最后补充一点,无论node,还是浏览器,js都运行在单线程环境中,只有node的异步IO运行在线程池中,当某个事件执行密集计算阻塞住事件循环时,如while(true) {}
,浏览器会停止响应,node也会被卡死。