Ожидание синхронной функции с внутренним обратным вызовом - PullRequest
1 голос
/ 17 июня 2020

У меня есть несколько синхронных функций, некоторые из которых не являются моим собственным кодом. Эти функции принимают и выполняют функции обратного вызова по завершении.

Мне нужно дождаться завершения этих обратных вызовов и после этого выйти из приложения. Как я могу добиться этого?

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);

В приведенном выше коде я хочу обеспечить плавное завершение работы приложения.

Все запущенные файлы останавливаются, а затем я могу вызвать процесс . выход (0) .

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы должны уметь играть с обещаниями:

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);
0 голосов
/ 17 июня 2020

Используйте счетчик для отслеживания количества ожидающих обратных вызовов.

const serverGracefulShutdown = () => {

     logger.info('Signal received: Gracefully killing application');

    var wait = 3;

    function safeExit(rv) {
        if(--wait == 0) {
                logger.info('Application closed');
                process.exit(rv);
        }
    }

    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);
...