0

この xhrWithRetry メソッドを作成しました。

目的: サービス呼び出しがエラー コード 500 で失敗した場合に備えて、この 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 ベースのコーディング標準に準拠するための文体です。唯一の 2 つの本当に気の利いた提案は次のとおりです。

  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 に答える