node.js 中的 exit 事件与手册中的行为不同
`exit` event in node.js behaves different than in the manual
https://nodejs.org/api/process.html
Listener functions must only perform synchronous operations. The
Node.js process will exit immediately after calling the 'exit' event
listeners causing any additional work still queued in the event loop
to be abandoned. In the following example, for instance, the timeout
will never occur:
process.on('exit', (code) => {
setTimeout(() => {
console.log('This will not run');
}, 0);
});
现在我的 main.js 中有了这个:
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
事件后进行异步操作。手册说这是不可能的。
什么是对什么是错?
那是因为您正在手动发出一个名为 exit
的事件,它本身不会引起任何特殊行为。仅当您使用 process.exit
时,如
if (errors)
process.exit(1);
它会产生文档中描述的效果。
https://nodejs.org/api/process.html
Listener functions must only perform synchronous operations. The Node.js process will exit immediately after calling the 'exit' event listeners causing any additional work still queued in the event loop to be abandoned. In the following example, for instance, the timeout will never occur:
process.on('exit', (code) => {
setTimeout(() => {
console.log('This will not run');
}, 0);
});
现在我的 main.js 中有了这个:
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
事件后进行异步操作。手册说这是不可能的。
什么是对什么是错?
那是因为您正在手动发出一个名为 exit
的事件,它本身不会引起任何特殊行为。仅当您使用 process.exit
时,如
if (errors)
process.exit(1);
它会产生文档中描述的效果。