2013-04-11 107 views
0

我写过这个xhrWithRetry方法。有没有更好的方法来编写这个xhrRetry实用程序函数?

用途:如果服务调用失败并返回错误代码500,则此util实用程序将重试几次。调用此util方法的客户机代码应该能够通过链接一个然后处理程序来捕获此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; 
     }); 
    } 
}); 

回答

1

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

1

我认为你拥有它的方式可能是实现你想要的最有效的方法。现在我已经仔细考虑过了,在Promise/A的环境中,我看到other implementations的重试功能看起来几乎完全相同。

因此,我可以想到过去@ma_il的建议,使重试次数可配置唯一的调整主要是风格与JS提示为基础的编码标准。只有两个真正的挑剔的建议是:

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

}())); 
+0

'那么()'总是返回的承诺。在例外的情况下,不返回或返回不是承诺的价值 - 它将其包含在Promise中,Promise的实现值是返回值。顺便说一句 - 在上面的函数中返回{x:x}的技巧很好。谢谢。 – Sushil 2013-04-12 02:22:25

+0

我很难分析你的第二句话,直到我从上面试过你的代码。我不知道如果在你的第一个'.then()'调用中你传递null来获得成功,它会将你的值转发给下一个'.then()'调用。以及不知道如果你抛出一个错误,它会自动将它包装在你的承诺中。我想我第一次误解了你的问题。因此,我会更新我的答案。 – GotDibbs 2013-04-12 03:10:06

+0

感谢您的链接到其他实现。 – Sushil 2013-04-12 05:14:45

相关问题