有没有明显更好的方法来编写这个xhrRetry实用程序函数?

时间:2013-04-11 11:05:31

标签: windows-8 windows-runtime winjs

我已经编写了这个xhrWithRetry方法。

目的:这个util方法将重试几次,以防服务调用失败,错误代码为500.调用此util方法的客户端代码应该能够通过链接一个then处理程序来捕获此util方法中抛出的任何异常。每次重试都应延迟几毫秒。

在我的测试中,

  1. 我能够在调用代码中捕获最大重试后最后抛出的异常。
  2. 代码也适用于非错误情况。
  3. 这个问题主要是看是否有更好的方法来编写相同的异步函数。

    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;
            });
        }
    });
    

2 个答案:

答案 0 :(得分:1)

你可以使maxRetries和超时可配置,但一般来说这看起来非常好。

答案 1 :(得分:1)

我认为你拥有它的方式可能是实现你所期待的最有效的方式。现在我已经考虑了更多,我在other implementations的上下文中看到Promise/A的重试函数看起来几乎相同。

因此,我能想到的唯一调整是@ma_il的建议,使重试次数可配置,主要是风格,以保持基于JS Hint的编码标准。只有两个真正的挑剔建议是:

  1. 在查看状态之前,先查看是否已超出retryCount,使if语句短路。
  2. 在状态检查中使用严格等于(===)。
  3. 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
        };
    
    }()));