node.js - 为什么作为响应 SIGINT 信号的回调调用的方法在进程终止之前没有完全完成?

我正在尝试创建一种正常关闭我的服务器的方法,但似乎为响应 SIGINT 而调用的方法并未完全完成。

我使用 process.on('SIGINT', cb) 向 SIGINT 信号添加了一个回调函数

var stop = () => {
  console.log("stopping server");
  return new Promise((resolve, reject) =>
    server.close(() => { console.log("server closed"); resolve(); }))
    .then(() => new Promise((resolve, reject) => setTimeout(() => { console.log("time out finished"); resolve(); }, 5000)))
    .then(() => process.exit(0));
}

process.on("SIGINT", stop);

我在其中添加了 setTimeout 只是为了测试服务器在完全关闭之前是否正在等待。

当我向进程发送 SIGINT 时,我得到的输出是

停止服务器

在某些情况下,停止服务器和服务器关闭日志都会出现,但并非总是如此。

我已经尝试实现上一个问题的等待功能:How to prevent Node.js from exiting while waiting for a callback? , 但我仍然取得了与上述相同的结果。

有谁知道可以让此方法在服务器退出之前完全完成的解决方法?

最佳答案

我在这方面遇到了真正的麻烦,使用 promise 和回调似乎都不起作用。 对于我自己,我认为在我的 winston 记录器将所有信息保存到文件之前进程队列清空(并且 Node 退出)。

无论如何,我最终通过为每个我想退出的进程设置手动标志来解决这个问题,以便在完成后返回 true。退出本身以 100 毫秒为间隔,并且只会在所有标志为真时退出。

例如

process.on('SIGINT', exit);

function exit(){
    var myProcessFlag = myProcess.close()    //returns true once complete

    setInterval(function(){
        if(myProcessFlag == true){
            console.log('successful exit');
            process.exit(0);
        }
        else{
            console.log(`awaiting...
                         myProcess complete: ${myProcessFlag}`);
        }
    }, 100);
}

https://stackoverflow.com/questions/54170321/

相关文章:

css - VS Code 中的“导航到声明/实现”

python - 需要帮助来模拟 xhr 请求

laravel - Vue 多选 laravel 提交表单

flutter - 为什么 build() 在后台的屏幕上被多次调用?

reactjs - 从 DateInput BlueprintJS 更改月份名称

apache-spark - 我的 SparkSession 初始化需要很长时间才能在我的笔记本电脑

android - Cordova 插件文件路径 : Unable to resolve files

azure - AADSTS50011 : The reply url specified in t

angular - NRWL 中的多个应用程序可以访问定义文件的位置

python - gremlin-python : what is a valid vertex c