Sto usando la libreria di promessa Bluebird. Ho una catena di funzioni promisified come la seguente:Come puoi riprovare dopo un'eccezione in Javascript quando usi le promesse?
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
});
Di tanto in tanto sendMessage non riuscirà perché, diciamo, il server di rispondere alle non è disponibile. Voglio che il codice continui a cercare di rispondere all'infinito finché non ci riesce. Non puoi semplicemente racchiudere sendMessage in una presa perché in realtà non genera un'eccezione, suppongo, chiama la funzione "error" che, in questo codice promesso, è il "catch" in basso. Quindi ci deve essere un modo per "riprovare" inviare un messaggio nella sezione "catch". Il problema è che anche se ripasso in un loop nel "catch" non ho ancora modo di saltare alla catena delle promesse ed eseguire le restanti funzioni promesse. Come gestisco questo?
EDIT:
mio tentativi per un post HTTP ha finito per assomigliare a questo:
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);
});
}
Non vedo 'sendMessage' qui. – Jacob
Spiacente, sendResponse dovrebbe essere sendMessage – Mike
Penso che sia interessante che ho detto che voglio riprovare per sempre ma ogni risposta è stata scritta per un numero limitato di tentativi. Deve esserci qualcosa sul looping per sempre che disturba le persone. – Mike