Разрешение setTimeout внутри конечной точки API

Мне нужно добавить задержку к вызову API, поэтому я использую setTimeout. Через 2 секунды после успеха мне нужно вернуть res.status(200).json(response).

  exports.someEndpoint = function(req, res) {
    return request.post({
      url: //etc
    })
    .then(function(response) {
      return new Promise(function(resolve, reject) {
        setTimeout(function() {
          // is this right?
          resolve(
            res.status(200).json(response);
          );
        }, 2000);
      });
    });
  };

Мой вопрос: мне нужно вызвать resolve внутри setTimeout? Или я могу просто полностью его опустить?

Ответ 1

Ваш код эквивалентен:

  exports.someEndpoint = function(req, res) {
    return request.post({
      url: //etc
    })
    .then(function(response) {
        setTimeout(function() {
            res.status(200).json(response);
        }, 2000);
    });
  };

Но только потому, что это обработчик экспресс-маршрута, который не должен возвращать что-либо вообще или обещание в частности.

С другой стороны, ваш код:

  exports.someEndpoint = function(req, res) {
    return request.post({
      url: //etc
    })
    .then(function(response) {
      return new Promise(function(resolve, reject) {
        setTimeout(function() {
          // is this right?
          resolve(
            res.status(200).json(response);
          );
        }, 2000);
      });
    });
  };

может быть вызван как:

yourModule.someEndpoint(req, res).then(function () {
  // code to run after the timeout
});

что было бы невозможно в более короткой версии.

Ответ 2

Нужно ли мне разрешать внутри setTimeout?

Это зависит от того, что произойдет с exports.someEndpoint, но обычно да - вы хотели бы вернуть Promise, который завершил выполнение всех асинхронных операций в нем.

Например, если ваш экспресс-обработчик захватывается функцией, ожидающей обещания, поток будет продолжаться до того, как вы ответите своему пользователю.

Если вы не заботитесь о promises в вашем обработчике запросов, вы также можете не return request.post({ и просто ничего не возвращать.