Windows 8 有没有更好的方法来编写这个Xhretry实用程序函数?
我已经编写了这个xhrWithRetry方法 目的:如果服务调用失败且错误代码为500,此util方法将重试几次。调用此util方法的客户端代码应该能够通过链接then处理程序来捕获此util方法中引发的任何异常。每次重试应延迟几毫秒 在我的测试中Windows 8 有没有更好的方法来编写这个Xhretry实用程序函数?,windows-8,windows-runtime,winjs,Windows 8,Windows Runtime,Winjs,我已经编写了这个xhrWithRetry方法 目的:如果服务调用失败且错误代码为500,此util方法将重试几次。调用此util方法的客户端代码应该能够通过链接then处理程序来捕获此util方法中引发的任何异常。每次重试应延迟几毫秒 在我的测试中 我能够在调用代码中捕获在最大重试次数后最后抛出的异常 代码也适用于非错误场景 这个问题主要是看是否有更好的方法来编写相同的异步函数 WinJS.Namespace.define('Utils.Http', { xhrWithRetry: fu
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;
});
}
});
WinJS.Namespace.define('Utils.Http',
{
xhrWithRetry:函数xhrWithRetry(选项,retryCount)
{
var maxRetries=5;
if(retryCount==未定义)
retryCount=0;
返回WinJS.xhr(选项)。然后返回(null,函数onerror(错误)
{
if(error.status==500&&retryCount
您可以将maxRetries和超时设置为可配置的,但一般来说,这看起来非常好。我认为您使用的方式可能是实现所需的最有效的方式。现在我已经仔细考虑过了,我看到了重试函数在上下文中看起来几乎相同
因此,我能想到的唯一的调整就是@ma_-il建议将重试次数设置为可配置的,主要是为了符合JS基于提示的编码标准。唯一两个真正挑剔的建议是:
if
语句=
)WinJS.Namespace.define('Utils.Http',(函数(){
函数xhrWithRetry(选项,retryCount){
var maxRetries=5;
如果(!retryCount){
retryCount=0;
}
返回WinJS.xhr(选项),然后返回(null,
函数onError(错误){
if(retryCount
then()
始终返回承诺。在例外情况下,不返回或返回的值不是承诺-它将其包装在承诺中,承诺的实现值就是返回值。顺便说一句,在上面的函数中返回{x:x}的技巧很好。谢谢。我很难解析你的第二句话,直到我试过上面的代码。我不知道,如果在第一次.then()
调用中,您成功通过null,它会将您的值转发给下一次.then()
调用。我也不知道如果你犯了一个错误,它会自动把它包装成一个对你的承诺。我想我第一次误解了你的问题。因此,我将更新我的答案。@gotdibs为什么决定以这种方式导出xhrWithRetry,而不仅仅是使用:WinJS.Namespace.define('Utils.Http',{xhrWithRetry:function(options,retryCount){})代码>@philk这纯粹是一种风格。使用显示模块模式定义对象允许使用“私有”函数和变量,在定义的末尾为您提供了一个漂亮的“类”签名(这样您就知道什么是“公共”),您不必到处引用this
关键字,然后命名命名空间中的函数(不是匿名的)默认情况下(即无需执行xhrWithRetry:function xhrWithRetry()
),这有助于堆栈跟踪。
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
};
}()));