等待带有内部回调的同步功能

问题描述 投票:0回答:2

我有一些同步功能,其中一些不是我自己的代码。这些函数在完成时接受并执行回调函数。

我需要等待这些回调完成,然后再退出应用程序。我该如何执行?

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)

node.js asynchronous shutdown
2个回答
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);

0
投票

使用计数器来跟踪有多少个回调待处理。

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);
© www.soinside.com 2019 - 2024. All rights reserved.