【发布时间】:2015-08-08 20:52:56
【问题描述】:
我正在使用 Bluebird Promise 库。我有一系列承诺功能,如下所示:
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 中,因为它实际上并没有引发异常,我想它调用了“错误”函数,在这个承诺的代码中,它是底部的“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);
});
}
【问题讨论】:
-
我在这里看不到
sendMessage。 -
对不起,sendResponse 应该是 sendMessage
-
我认为我说我想永远重试很有趣,但到目前为止,每个答案都是为有限次数的重试而编写的。一定有一些关于永远循环的事情让人们感到困扰。
标签: javascript node.js exception-handling promise bluebird