Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript `node.js中的exit`event的行为与手册中的不同_Javascript_Node.js_Asynchronous_Listener_Shutdown Hook - Fatal编程技术网

Javascript `node.js中的exit`event的行为与手册中的不同

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) => {

侦听器函数只能执行同步操作。这个 Node.js进程将在调用“exit”事件后立即退出 导致任何额外工作的侦听器仍在事件循环中排队 被抛弃。例如,在下面的示例中,超时 永远不会发生:

现在我在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
事件后执行异步操作。手册上说这是不可能的


什么是对的,什么是错的?

这是因为您手动发出一个名为退出的事件,它本身不会导致任何特殊行为。只有当你在


它将具有文档中描述的效果。

调用
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);