Korzystam z biblioteki obietnic Bluebird. Mam łańcuch promisified funkcji takich jak następuje:Jak można powtórzyć po wyjątku w JavaScript podczas korzystania z obietnic?
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
});
Czasami sendMessage nie powiedzie się z powodu, powiedzmy, serwer do reagowania na nie jest dostępna. Chcę, aby kod nadal próbował odpowiadać na wieki, dopóki to się nie powiedzie. Nie można po prostu zawinąć sendMessage w catch, ponieważ tak naprawdę nie wyrzuca wyjątku, jak przypuszczam, wywołuje funkcję "error", która w tym promisified code jest "catch" na dole. Musi być więc jakiś sposób na "ponowienie" wysłania wiadomości w sekcji "catch". Problem polega na tym, że nawet jeśli spróbuję powtórzyć pętlę w "haczyku", nadal nie mam możliwości, aby przeskoczyć do łańcucha obietnic i wykonać pozostałe promnizowane funkcje. Jak sobie z tym poradzić?
EDIT:
Moja ponawiania przez HTTP POST zakończył się patrzy tak:
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);
});
}
Nie widzę tutaj "sendMessage". – Jacob
Przepraszam, sendResponse powinno być sendMessage – Mike
Myślę, że to interesujące, że powiedziałem, że chcę ponowić próbę na zawsze, ale każda odpowiedź do tej pory została napisana tylko dla skończonej liczby ponownych prób. Musi być coś takiego w pętli na zawsze, co przeszkadza ludziom. – Mike