Javascript `node.js中的exit`event的行为与手册中的不同
侦听器函数只能执行同步操作。这个 Node.js进程将在调用“exit”事件后立即退出 导致任何额外工作的侦听器仍在事件循环中排队 被抛弃。例如,在下面的示例中,超时 永远不会发生: 现在我在main.js中有了这个:Javascript `node.js中的exit`event的行为与手册中的不同,javascript,node.js,asynchronous,listener,shutdown-hook,Javascript,Node.js,Asynchronous,Listener,Shutdown Hook,侦听器函数只能执行同步操作。这个 Node.js进程将在调用“exit”事件后立即退出 导致任何额外工作的侦听器仍在事件循环中排队 被抛弃。例如,在下面的示例中,超时 永远不会发生: 现在我在main.js中有了这个: if (errors) { process.exitCode = 1; } process.emit("exit"); 在具有关机侦听器等的记录器中,我有一个mongo连接和以下内容: process.on("exit", (code) => {
if (errors) {
process.exitCode = 1;
}
process.emit("exit");
在具有关机侦听器等的记录器中,我有一个mongo连接和以下内容:
process.on("exit", (code) => {
if (this.status.finishedAt === null) {
this.status.currentState = StatusUpdater.STATE_STOPPED;
this.status.finishedAt = new Date();
this.persistStatus()
.then(() => {
this.mongoDb.close().then(() => {
setTimeout(() => {
console.log('byebye');
process.exit(code);
}, 5000);
});
})
.catch(this.noMongoConnection);
}
});
输出为:byebye
5秒后
现在我很困惑。显然,我可以在触发exit
事件后执行异步操作。手册上说这是不可能的
什么是对的,什么是错的?这是因为您手动发出一个名为退出的事件,它本身不会导致任何特殊行为。只有当你在
它将具有文档中描述的效果。调用
process.exit(代码)退出
事件处理程序中的code>非常奇怪。我想知道这是否真的会触发所有处理程序两次。@Bergi确实会,所以我检查finishedAt
是否未定义。另外,当您触发一个SIGINT
时,exit
事件也会在之后被调用。@Bergi除了我是如何做的之外,您对关闭处理程序还有什么想法吗?我的解决方案唯一的缺点是,如果存在另一个退出侦听器,并且当我在另一个侦听器之前执行process.exit()。我不会从mongodb处理程序调用process.exit(1)
,而是从触发关机事件的位置调用。调用.exit()
和发出exit
事件之间的区别在文档中应该更清楚,但您的答案有助于理解这两种情况不同。
process.on("exit", (code) => {
if (this.status.finishedAt === null) {
this.status.currentState = StatusUpdater.STATE_STOPPED;
this.status.finishedAt = new Date();
this.persistStatus()
.then(() => {
this.mongoDb.close().then(() => {
setTimeout(() => {
console.log('byebye');
process.exit(code);
}, 5000);
});
})
.catch(this.noMongoConnection);
}
});
if (errors)
process.exit(1);