0

我已经写了这个 xhrWithRetry 方法。

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

在我的测试中,

  1. 我能够在调用代码中捕获最大重试后最后抛出的异常。
  2. 代码也适用于非错误场景。

这个问题主要是看是否有更好的方法来编写相同的异步函数。

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

2 回答 2

1

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

于 2013-04-11T11:36:23.617 回答
1

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

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

  1. if通过查看是否已超过 retryCount 来缩短您的语句,甚至无需检查状态。
  2. ===在状态检查中使用严格的等号 ( )。
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
    };

}()));
于 2013-04-11T14:35:07.777 回答