如果有一个 a.js ,它的文件内容如下:
console.log(1);
当使用 node a.js
运行时,它会打印 1 并退出进程。这是因为当 evnetloop 任务队列中没有更多的任务时,就会自动罢工。
如果我们将文件内容改为如下:
console.log(1);
const timer = setInterval(() => {
console.log(new Date, "=> I'm alive!");
}, 1000);
运行它,进程就会保持运行,并一直有日志打印出来。

很好理解,这是因为 setInterval() 会一直往任务队列里加任务。
但有一些情况,我们希望在做主工作 A 时,让定时任务做一些非必要的辅助工作 B,当 A 完成后,整个进程自动退出,不用去考虑 B。即,忽略某些定时器对进程退出的阻碍。
怎么做呢?
其实 setInterval() 返回的是一个 Timeout 对象(setTimeout也是),该对象有一个 unref() 方法就是做这件事的。
所以我们可以这样写:
console.log(1);
const timer = setInterval(() => {
console.log(new Date, "=> I'm alive!");
}, 1000);
timer.unref();
同理,你也可以用 ref() 方法恢复默认效果。
原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字 原创300字
原文始发于微信公众号(背井):不让定时器影响Node.js进程的退出
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246654.html