time.unref 没有按预期取消对应的函数回调
发布于 7 年前 作者 dmodaii 2884 次浏览 来自 问答
var timer = setInterval(function () {
	console.log(new Date, 1)
}, 1000)

var fn = function () {
	console.log(new Date, 2)
}

var timer2 = setInterval(fn, 1000)
timer2.unref()

在这里一直会间断输出1, 2, 为什么timer2 的回调没有被取消

  • 使timer2正常unref 1.但是将timer 这段代码去除就可以正常的取消timer2 的回调了, 2、timer 也加上 unref

难道是永远只能有一个setInterval 在event loop中才能使用unref 生效吗

9 回复

目前百度出来的中文内容都只说了一半,看官方文档:

The opaque value returned by setTimeout and setInterval also has the method timer.unref() which allows the creation of a timer that is active but if it is the only item left in the event loop, it won’t keep the program running. If the timer is already unrefd calling unref again will have no effect.

注意 if it is the only item left in the event loop. 你的代码里有两个timer,当然就不会不执行回调函数了

没弄清楚,你说的时间的关系是啥意思。

unref的意义和作用,官方文档写的挺清楚的

When called, the active Timeout object will not require the Node.js event loop to remain active. If there is no other activity keeping the event loop running, the process may exit before the Timeout object’s callback is invoked. Calling timeout.unref() multiple times will have no effect.

场景的话,相信你理解了文档,也就能想明白了


另外关于unref有个经典的回答,你可以看下coordcn的回答

取消回调不是 unref… 而是 clearInterval

@soda-wy 受教, 谢谢

@atian25 这里主要说unref 不管clearInterval

为什么timer2 的回调没有被取消

因为你没有调用 clearInterval 所以从来没有什么取消回调。 你之所以觉得取消回调,是因为 unref 两个 timer 后,或者去掉 timer 后,整个 event loop 就没有东西了,就会整个进程退出,所以 timer2 被自动回收了。

var timer = setTimeout(function () {
	console.log(new Date, 1)
}, 1000)

var fn = function () {
	console.log(new Date, 2)
}

var timer2 = setInterval(fn, 500)
timer2.unref()

2018-01-29T10:06:00.143Z    2
2018-01-29T10:06:00.595Z    1
2018-01-29T10:06:00.597Z    2

setTimeout 是一次性的… 执行完了就没了,然后 timer2.unref() 后也不在 event loop 了… 程序就退出了…

回到顶部