2016-11-21 3 views
0

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

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

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

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

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

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

0

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

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

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

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