Node.js 为什么节点js没有';承诺电话后不要退出

Node.js 为什么节点js没有';承诺电话后不要退出,node.js,Node.js,在以下代码中: function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } sleep(10000); 为什么NodeJS不立即退出?是什么原因导致人们等待承诺 我想我需要等待睡眠(10000),但这会产生一个错误。Nodejs在退出前等待仍然处于活动状态的计时器。通过对计时器对象本身调用.unref(),可以告诉它不要等待计时器 因此,它实际

在以下代码中:

function sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}

sleep(10000);
为什么NodeJS不立即退出?是什么原因导致人们等待承诺


我想我需要等待睡眠(10000),但这会产生一个错误。

Nodejs在退出前等待仍然处于活动状态的计时器。通过对计时器对象本身调用
.unref()
,可以告诉它不要等待计时器

因此,它实际上并不是在等待承诺,而是在等待计时器

在内部,node.js保留了一个未被
.unref()
打开的计时器的引用计数,并且在该计数(除其他外)为零之前不会退出


以下是几段摘录自:

类:超时

默认情况下,当使用setTimeout()或setInterval()调度计时器时,只要计时器处于活动状态,Node.js事件循环就会继续运行。这些函数返回的每个超时对象都会导出Timeout.ref()和Timeout.unref()函数,这些函数可用于控制此默认行为

超时。unref()

调用时,活动超时对象将不要求Node.js事件循环保持活动状态。如果没有其他活动保持事件循环运行,则进程可能会在调用超时对象的回调之前退出。多次调用timeout.unref()将无效


查看节点中计时器的
unref()
函数-

调用时,活动的
Timeout
对象将不要求Node.js事件循环保持活动状态。如果没有其他活动保持事件循环运行,则进程可能会在调用
超时
对象的回调之前退出

您可以创建一个超时并对其调用
unref()
函数-如果节点只等待超时,这将阻止节点保持活动状态

function sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms).unref();
    });
}
作为旁注,相同的
unref
函数也可用于
setTimeout
调用


正如正确指出的,保持节点活动的不是承诺,而是超时

function sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms).unref();
    });
}