node.js - 为什么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
处理程序是异步处理程序。根据文档不接受异步函数。SIGTERM
SIGINT
await
test
.on
那么EventEmitter
实际上是否接受async
处理程序?
编辑:从这些官方 node.js文档来看,似乎支持返回 Promise 的事件处理程序,这个提及肯定应该在文档中更加突出。但是,除非使用选项EventEmitter
启动类,否则 Promise-rejections 将被忽略。captureRejections: true
从 node.js 16 版本开始,该选项是实验性的。
解决方案
所以我在文档中找到了这个,我希望它有助于“异步与同步#EventEmitter 按照注册顺序同步调用所有监听器。这确保了事件的正确排序并有助于避免竞争条件和逻辑错误。当适当地,侦听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:“ 文档靠近页面顶部。我不确定这是否是一个完整的答案,但我希望它有所帮助
推荐阅读
- python - 当我在 pyqt5 中使用 Slider 时,为什么我的程序正在关闭?
- css - 是否可以将 css 表拆分为多列?
- flutter - Flutter:未来的延续
- tsung - Tsung 图上输入的数字是干什么用的?
- ios - XCode 随机修改我的方案内容
- python - 如何隐藏具有特定值的单元格的行?
- docker - 如何使用 Dockerfile 从 URL 下载文件
- qprocess - QProcess 不启动 diskpart
- c++ - 如何创建一个无边框的 wxDialog 并在对话框的右上角添加一个关闭按钮图标?
- c# - C# .net core WEB-API "proxy" file download