我有一些同步功能,其中一些不是我自己的代码。这些函数在完成时接受并执行回调函数。
我需要等待这些回调完成,然后再退出应用程序。我该如何执行?
const serverGracefulShutdown = () => {
logger.info('Signal received: Gracefully killing application');
httpServer.close(() => {
logger.info('Apollo server closed');
});
redis.quit(() => {
logger.info('Redis client closed');
});
stopKafkaConsumer(() => {
logger.info('Kafka consumer closed');
});
logger.info('Application closed');
process.exit(0);
};
process.on('SIGINT', serverGracefulShutdown);
process.on('SIGTERM', serverGracefulShutdown);
在上面的代码中,我要确保正常关闭应用程序。
所有正在运行的东西都停止了,然后我可以调用process.exit(0)。
您应该能够兑现承诺:
const serverGracefulShutdown = () => {
logger.info('Signal received: Gracefully killing application');
const promises = [
new Promise((resolve, reject) => httpServer.close(() => {
logger.info('Apollo server closed');
// do you get an optional error param inside this callback?
// if yes, then "if (error) reject(error) else resolve()"
// (or any other way to mark this operation as failed)
resolve();
})),
new Promise((resolve /* + reject? */) => redis.close(() => {
logger.info('Redis client closed');
resolve();
})),
new Promise((resolve /* + reject? */) => stopKafkaConsumer(() => {
logger.info('Kafka consumer closed');
resolve();
}))
];
return Promise.all(promises).then(() => {
logger.info('Application closed');
process.exit(0);
}).catch((error) => {
// what's your plan if at least one failed?
});
};
process.on('SIGINT', serverGracefulShutdown);
process.on('SIGTERM', serverGracefulShutdown);
使用计数器来跟踪有多少个回调待处理。
const serverGracefulShutdown = () => {
logger.info('Signal received: Gracefully killing application');
let wait = 3;
function safeExit(rv) {
if(--wait == 0) {
logger.info('Application closed');
process.exit(0);
}
}
httpServer.close(() => {
logger.info('Apollo server closed');
safeExit(0);
});
redis.quit(() => {
logger.info('Redis client closed');
safeExit(0);
});
stopKafkaConsumer(() => {
logger.info('Kafka consumer closed');
safeExit(0);
});
};
process.on('SIGINT', serverGracefulShutdown);
process.on('SIGTERM', serverGracefulShutdown);