node.js - 等待带有内部回调的同步函数
问题描述
我有几个同步函数,其中一些不是我自己的代码。这些函数在完成时接受并执行回调函数。
我需要等到这些回调完成后退出应用程序。我该如何执行?
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)。
解决方案
你应该能够使用 Promise:
const serverGracefulShutdown = () => {
logger.info('Signal received: Gracefully killing application');
const promises = [
new Promise((resolve, reject) => httpServer.close(() => {
// 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)
logger.info('Apollo server closed');
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);
推荐阅读
- typescript - 无法将断言文件夹中的自定义图标设置为微前端中的 p-menuitem-icon?
- networking - 使用ipv6制作公共服务器时如何正确绑定
- c++ - 通过循环在构造函数中的数组中分配/打印字符的问题
- python - 无法在 pyenv 虚拟环境中使用 python 3.6.0 安装 tensorflow==1.13.1
- powershell - 将字符串参数值提供给文件路径末尾时,不包含在 powershell 脚本中
- android - 应用程序上传在 Google Play 商店中被拒绝原因高分辨率图标
- jquery - 修复 jQuery 公式
- javascript - 添加javascript文件以做出反应
- javascript - 从本地服务器提供的 HTML 视频仅出现在 Firefox 中,而不出现在任何其他浏览器中
- python - Python从以前没有一起选择的列表中选择两个随机项目