Я использую библиотеку обещаний Bluebird. У меня есть цепь promisified функций вроде следующего:Как вы можете повторить попытку после исключения в Javascript при использовании обещаний?
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», у меня все еще нет возможности перейти к цепочке обещаний и выполнить оставшиеся обещанные функции. Как мне с этим справиться?
EDIT:
Моя повторная попытка для 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);
});
}
Я не вижу здесь 'sendMessage'. – Jacob
К сожалению, sendResponse должен быть sendMessage – Mike
Я думаю, что это интересно, что я сказал, что хочу повторить попытку навсегда, но каждый ответ до сих пор был написан только для конечного числа попыток. Наверное, должно быть что-то о зацикливании навсегда, что беспокоит людей. – Mike