Windows 8 有没有更好的方法来编写这个Xhretry实用程序函数?

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

我已经编写了这个xhrWithRetry方法

目的:如果服务调用失败且错误代码为500,此util方法将重试几次。调用此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;
            });
        }
    });
    
    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基于提示的编码标准。唯一两个真正挑剔的建议是:

  • 在检查状态之前,先查看retryCount是否已超过,从而缩短您的
    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
        };
    
    }()));