2013-04-11 106 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

相關問題