Как можно повторить попытку после исключения в Javascript при использовании обещаний?
Я использую библиотеку обещаний Bluebird. У меня есть цепочка обещанных функций, таких как следующие:
receiveMessageAsync(params)
.then(function(data)) {
return [data, handleMessageAsync(request)];
})
.spread(function(data, response) {
return [response, deleteMessageAsync(request)];
})
.spread(function(response, data) {
return sendResponseAsync(response);
})
.then(function(data) {
return waitForMessage(data);
})
.catch (function(err) {
// handle error here
});
Иногда sendMessage не работает, потому что, скажем, сервер, на который нужно ответить, недоступен. Я хочу, чтобы код продолжал пытаться отвечать вечно, пока это не удастся. Вы не можете просто обернуть sendMessage в catch, потому что он на самом деле не выдает исключение, я полагаю, он вызывает функцию «error», которая в этом обещанном коде является «catch» внизу. Таким образом, должен быть какой-то способ «повторить» отправку сообщения в разделе «catch». Проблема в том, что даже если я повторяю цикл в «catch», у меня все равно нет возможности перейти к цепочке обещаний и выполнить оставшиеся обещанные функции. Как мне с этим бороться?
РЕДАКТИРОВАТЬ:
Моя повторная попытка получить сообщение HTTP выглядела так:
function retry(func) {
return func()
.spread(function(httpResponse) {
if (httpResponse.statusCode != 200) {
Log.error("HTTP post returned error status: "+httpResponse.statusCode);
Sleep.sleep(5);
return retry(func);
}
})
.catch(function(err) {
Log.err("Unable to send response via HTTP");
Sleep.sleep(5);
return retry(func);
});
}