如何使用节点等待退出回调中的setTimeout?

时间:2018-12-17 20:53:57

标签: node.js

我有以下代码...

async function finish(){
    console.log("Finishing");
    console.time("fin");
    let test = await new Promise(function(res){
         setTimeout(()=>{res(test)}, 2000);
    });
    console.timeEnd("fin");
    console.log(test);
};
process.on('exit', finish);

我希望它在退出时等待两秒钟,并输出接近2s的时间戳。但是,当我运行时,时间戳会更短,并且在完成后不会打印任何行。

如何等待退出超时?

1 个答案:

答案 0 :(得分:3)

node docs中,您不能在退出事件中使用异步代码。

  

侦听器功能只能执行同步操作。调用“退出”事件侦听器后,Node.js进程将立即退出,从而导致仍在事件循环中排队的任何其他工作都将被放弃。

如果要在退出之前安排其他工作(例如异步功能),则需要使用beforeExit

process.on('beforeExit', finish);

话虽如此,您还需要认识到beforeExit仅在流程停止工作时才发出,因此a)如果明确要求终止(例如process.exit(),则不会发出) )和b)除非发生这种情况,否则它将继续发光。