在事件循环为空或超时后退出Node.js进程

时间:2016-05-20 23:03:21

标签: javascript node.js asynchronous timeout

我有一个Node应用程序正在做一些异步的事情,我不能冒许多个模块中的一个做坏事并卡住的机会,所以应用程序将永远不会退出。 (它只是在向服务发送日志消息时发生的。)

我不能直接使用process.exit,因为无论有多少异步操作挂起,它都会终止。我仍然想尽早退出,所以这不会做:

function exit() {
    setTimeout(function() {
        process.exit(1);
    }, 10000);
}

因为那将等待10秒,即使一切都正常,所有异步事件在1秒后完成。

我考虑检查事件循环是否为空,除了这个计时器,然后退出。这可能是通过一些undocumented process methods来完成的,但我更喜欢避免那种阴暗的东西。关于更好的解决方法的任何想法?

1 个答案:

答案 0 :(得分:5)

您可以将计时器设置为您想要的“卡住”异步操作的超时持续时间。

然后.unref() the timer。这将使计时器本身不让node.js退出,因此当所有异步操作完成或计时器触发时,它将退出,以先到者为准。

function exit() {
    var t = setTimeout(function() {
        process.exit(1);
    }, 10000);
    // allow process to exist naturally before the timer if it is ready to
    t.unref();
}

有些东西告诉我,一个更可控和更强大的解决方案是在每个单独的异步事件上更强大地编码。像外部服务器的HTTP请求一样可以卡住的东西有自己的超时设置,所以如果你设置它们,那么它们将自己完成这种或那种方式,你不会冒外线的风险计时器可能会在异步操作完成之前触发,甚至没有卡住,但只是很慢。