添加data
事件侦听器process.stdin
添加对它的引用以保持进程打开。即使删除所有事件侦听器后,该引用仍保留在原处。你能做的就是手动unref()
它在你的回调中,如下所示:
console.log('Press Enter to allow process to terminate')
process.stdin.once('data', callback)
function callback (data) {
console.log('Process can terminate now')
process.stdin.unref()
}
另外,作为此类内容的通用调试工具,您可以调用两个(未记录的)函数来获取保持进程打开的事物列表:
process._getActiveHandles()
process._getActiveRequests()
See 这个拉取请求 https://github.com/joyent/node/issues/1025#issuecomment-10672235在背景节点项目中。
Update:您询问了有关在完成后附加事件侦听器的问题unref()
'd process.stdin
。这是一个简单的示例,显示侦听器确实附加了自身并发挥作用:
console.log('Press Enter to allow process to terminate')
process.stdin.once('data', callback)
function callback (data) {
console.log('Unreferencing stdin. Exiting in 5 seconds.')
process.stdin.unref()
process.stdin.once('data', function(data) {
console.log('More data')
})
setTimeout(function() {
console.log('Timeout, Exiting.')
}, 5000);
}
使用该代码,如果您在setTimeout
点火(5秒),然后你会看到More data
输出到控制台。一旦setTimeout
的回调触发,进程将退出。诀窍是setTimeout
正在创建一个计时器,该进程也保留一个引用。由于该进程仍然引用某些东西,因此它不会立即退出。一旦计时器触发,它就会释放引用并且进程退出。这也表明引用被添加(和删除)到自动需要它们的事物(由setTimeout
在这种情况下)。