我已经编写了这个xhrWithRetry方法。
目的:这个util方法将重试几次,以防服务调用失败,错误代码为500.调用此util方法的客户端代码应该能够通过链接一个then处理程序来捕获此util方法中抛出的任何异常。每次重试都应延迟几毫秒。
在我的测试中,
这个问题主要是看是否有更好的方法来编写相同的异步函数。
WinJS.Namespace.define('Utils.Http',
{
xhrWithRetry: function xhrWithRetry(options, retryCount)
{
var maxRetries = 5;
if (retryCount == undefined)
retryCount = 0;
return WinJS.xhr(options).then(null, function onerror(error)
{
if (error.status == 500 && retryCount < maxRetries)
return WinJS.Promise.timeout(100).then(function retryxhr()
{
return Utils.Http.xhrWithRetry(options, retryCount + 1);
});
throw error;
});
}
});
答案 0 :(得分:1)
你可以使maxRetries和超时可配置,但一般来说这看起来非常好。
答案 1 :(得分:1)
我认为你拥有它的方式可能是实现你所期待的最有效的方式。现在我已经考虑了更多,我在other implementations的上下文中看到Promise/A的重试函数看起来几乎相同。
因此,我能想到的唯一调整是@ma_il的建议,使重试次数可配置,主要是风格,以保持基于JS Hint的编码标准。只有两个真正的挑剔建议是:
if
语句短路。===
)。WinJS.Namespace.define('Utils.Http', (function () {
function xhrWithRetry(options, retryCount) {
var maxRetries = 5;
if (!retryCount) {
retryCount = 0;
}
return WinJS.xhr(options).then(null,
function onError(error) {
if (retryCount < maxRetries && error.status === 500) {
return WinJS.Promise.timeout(100).then(function retryxhr() {
return xhrWithRetry(options, ++retryCount);
});
}
throw error;
});
}
return {
xhrWithRetry: xhrWithRetry
};
}()));