Разрешение 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? Или я могу просто опустить это?

2 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам