首页 > 解决方案 > 为什么node.js进程退出后异步任务继续执行?

问题描述

下面是一个代码示例:

export const waitFor = seconds => new Promise(resolve => setTimeout(resolve, seconds * 1000))

const main = async () => {
    const test = async () => {
        await waitFor(30)
        console.log('after waitFor')
    }

    process.on('SIGTERM', test)
    process.on('SIGINT', test)
    await waitFor(30)
}

main().catch(error => console.error(error))

我通过运行从终端启动脚本,node myScript.js然后CTRL+C按键盘退出进程。但是,在 30 秒后,同一终端窗口中会显示一条消息:after waitFor.

我不明白为什么/ events的process.on处理程序是异步处理程序。根据文档不接受异步函数。SIGTERMSIGINTawaittest .on

那么EventEmitter实际上是否接受async处理程序?

编辑:从这些官方 node.js文档来看,似乎支持返回 Promise 的事件处理程序,这个提及肯定应该在文档中更加突出。但是,除非使用选项EventEmitter启动类,否则 Promise-rejections 将被忽略。captureRejections: true从 node.js 16 版本开始,该选项是实验性的。

标签: node.jsasync-awaitevent-handling

解决方案


所以我在文档中找到了这个,我希望它有助于“异步与同步#EventEmitter 按照注册顺序同步调用所有监听器。这确保了事件的正确排序并有助于避免竞争条件和逻辑错误。当适当地,侦听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:“ 文档靠近页面顶部。我不确定这是否是一个完整的答案,但我希望它有所帮助


推荐阅读