具有多种功能的NodeJS异步process.on

问题描述

我有一个调用 doLogic 函数/文件的主函数/文件。这个 doLogic 打开了一个数据库连接,我正在尝试使用 process.on('SIGINT') 来清理数据库,但是,当我按下 CTRL-C 时,该进程不会等待异步调用。

main.js

import {doLogic} from "./doLogic"
import {cleanup} from "./cleanup"

// Attach SIGINT listener
process.on("SIGINT",async () => {
   await cleanup()
   process.exit(0)
})

async function run() {
  doLogic()
}

run()

doLogic.js

import { connectionIds } from "./cleanup"

export async function doLogic {
  for (const desiredConnection of desiredConnections) {
      let id = await connectToDB(desiredConnection)
      connectionIds.add(id)
  }
}

cleanup.js

export const connectionIds = new Map()

// This function is just to simulate disconnecting
unlockConnection(connectionId) {
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve("resolve");
    },5* 1000);
    setTimeout(() => {
      reject("reject");
    },5 * 1000);
  });
}

export async function cleanup() {
   let asyncCalls = []
   for(const lockedConnection of connectionIds.keys()) {
       // I have also tried below with await unlockConn
       // But not much difference
       asyncCalls.push(unlockConnection(lockedConnection))
   }
   return Promise.all(asyncCalls)
}

奇怪的是它是严格的 doLogic() 似乎阻止了 await cleanup() 调用实际等待。如果我将其注释掉并使用 stdin() 暂停程序,那么如果我发送 SIGINT await cleanup() 似乎工作正常。我也可以确认地图中确实存在连接。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)