node中对于定时器timeout.unref()与clearTimeout() clearInterval()区别

先贴官方文档对于timeout.unref()的解释:当调用时,活动的 Timeout 对象不要求 Node.js 事件循环保持活动。 如果没有其他活动保持事件循环运行,则进程可能在 Timeout 对象的回调被调用之前退出。 多次调用 timeout.unref() 没有效果。

通俗易懂的解释就是:只有当目前的进程中只有一个定时器,且这个定时器对象调用了unref方法时,才会不去调用timeout对象的回调函数。

看例子:

 1 a===>> var timer = setInterval(function () {
 2          console.log(new Date, 1)
 3        }, 1000)
 4 
 5 var fn = function () {
 6     console.log(new Date, 2)
 7 }
 8 
 9 var timer2 = setInterval(fn, 1000)
10 
11 timer2.unref()

执行这段代码,结果是每隔1秒打印两个时间,貌似timer2.unref()这句不起作用。其实不是,再回想之前的原理:如果调用了unref函数的定时器在事件循环中是仅存在的一个, 那么程序不会继续运行下去;
函数中a处如果被注释掉, 此时相当于事件循环队列中只有一个timer2因此程序退出,如果把a处的setInterval换成setTimeout即让timer也仅运行一次, 那么timer和timer2都只会允许一次,
我理解的是timer 在的时候timer2在事件队列中不是唯一的因此它会继续执行.
至此,我认为已经把timeout.unref()的原理解释清了。接下来说下clear,我理解他就是彻底清除了预定的定时器。
posted @ 2018-07-09 22:01  王玮-web  阅读(745)  评论(0编辑  收藏  举报