在进程退出之前运行异步功能



我有一个简单的用 Node 编写的 shell 脚本.js我正在尝试在进程退出之前进行一些清理 (⌃C)。我编写了以下代码,但由于某种原因清理功能未完成。知道为什么吗?

if (keepAlive) {
process.stdin.resume();
['exit', 'SIGINT'].forEach(function(signal) {
process.on(signal, function() {
console.log("Received Signal: '" + signal + "'. Cleaning up...");
cleanup(function(err) {
console.log('this function is called but does not finish')
process.exit();
});
});
});
else {
process.exit();
}

我正在使用节点 v6.9.2

你可以这样做:

process.on("SIGTERM", () => {
ayncFunction().finally(() => process.exit(0));
});
process.on("SIGINT", () => {
ayncFunction().finally(() => process.exit(0));
});
process.on("exit", code => {
console.log(`APP stopped !`);
});

您无法可靠地从process.on('exit')运行异步代码。 这是文档的引述:

此时无法阻止事件循环的退出,一旦所有"exit"侦听器都完成了 Node 的运行.js进程将终止。

因此,一旦退出侦听器返回(即使它仍在尝试完成其异步处理),则进程将退出。

对于 SIGINT 处理程序,

您应该能够执行任何您想要的操作,因为一旦注册了 SIGINT 处理程序,就没有退出进程的默认行为,因此进程只会在您告诉它时退出。 从文档中:

如果其中一个信号 [SIGINT 或 SIGTERM] 安装了侦听器,则其默认行为将被删除(Node.js 将不再退出)。

这意味着,如果您正确编写了异步处理代码(问题中未显示),您应该能够在异步处理完成后退出。

相关内容

  • 没有找到相关文章

最新更新