Разрешение 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({
и просто ничего не вернуть.