Mik*_*ike 6 javascript exception-handling node.js promise bluebird
我正在使用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
});
Run Code Online (Sandbox Code Playgroud)
偶尔sendMessage会失败,因为,假设要响应的服务器不可用.我希望代码能够继续尝试永远响应,直到成功为止.你不能简单地将sendMessage包装在一个catch中,因为它实际上并没有抛出异常,我想,它调用了"error"函数,在这个promisified代码中,它是底部的"catch".因此必须有一些方法可以在"catch"部分"重试"发送消息.问题是,即使我在"catch"中循环重试,我仍然没有办法跳到promise链并执行剩余的promisified函数.我该如何处理?
编辑:
我对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);
});
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例重试功能(尚未测试):
function retry(maxRetries, fn) {
return fn().catch(function(err) {
if (maxRetries <= 0) {
throw err;
}
return retry(maxRetries - 1, fn);
});
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是,你可以包装一个函数,该函数返回一个promise,它会捕获并重试错误,直到重试失败.所以如果你要重试sendResponseAsync:
receiveMessageAsync(params)
.then(function(data)) {
return [data, handleMessageAsync(request)];
})
.spread(function(data, response) {
return [response, deleteMessageAsync(request)];
})
.spread(function(response, data) {
return retry(3, function () { return sendResponseAsync(response); });
})
.then(function(data) {
return waitForMessage(data);
})
.catch (function(err) {
// handle error here
});
Run Code Online (Sandbox Code Playgroud)
由于retry承诺在所有重试都已用完之前不会实际投入,因此您的调用链可以继续.
编辑:
当然,如果您愿意,您可以永远循环:
function retryForever(fn) {
return fn().catch(function(err) {
return retryForever(fn);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8852 次 |
| 最近记录: |