Como você pode tentar novamente após uma exceção no Javascript ao usar promessas?
Estou usando a biblioteca de promessas do Bluebird. Eu tenho uma cadeia de funções prometidas, como as seguintes:
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
});
Ocasionalmente, o sendMessage falha porque, digamos, o servidor ao qual responder não está disponível. Quero que o código continue tentando responder para sempre até que seja bem-sucedido. Você não pode simplesmente envolver o sendMessage em uma captura porque, na verdade, não gera uma exceção, suponho que ela chama a função "error" que, nesse código prometido, é a "catch" na parte inferior. Portanto, deve haver uma maneira de "tentar novamente" enviar a mensagem na seção "captura". O problema é que, mesmo se eu tentar novamente um loop no "catch", ainda não tenho como pular para a cadeia de promessas e executar as demais funções prometidas. Como faço para lidar com isso?
EDITAR:
Minha nova tentativa para uma postagem HTTP acabou assim:
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);
});
}