先贴官方文档对于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,我理解他就是彻底清除了预定的定时器。