问题描述
我有一个调用 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 (将#修改为@)