1

応答のエラー時に、ステータス コードとアクセス トークンがローカル ストレージに存在する場合、HTTP 要求を再試行するインターセプターを作成しました。

これは主に、使用している API (私には制御できない) からの不可解な応答の失敗に対処するために作成しました。理由もなく API エンドポイントが失敗する場合があるため、API のメンテナンスを制御できないため、HTTP 要求の送信を再試行するだけでよいと考えました。

primesis.factory('httpResponseErrorInterceptor', function ($q, $injector) {
    return {
        'responseError': function (response) {
            if(response.status === 500 && localStorage.getItem('token')) {
                var $http = $injector.get('$http');
                return $http(response.config);
            }
            return $q.reject(response);
        }
    };
});

   $httpProvider.interceptors.push('httpResponseErrorInterceptor');

ただし、これにより、API に実際にエラーがある場合に、インターセプターが無限に再試行することになります。

私が達成しようとしているのは、このインターセプターの再試行に制限を設けることです。カウンターを入れてみましたが、カウンターが次のインターセプター呼び出しに引き継がれないようです。

このような状況に対処するものを探していましたが、役に立ちませんでした。インターセプターの応答エラーの再試行を制限する方法はありますか?

4

2 に答える 2

2

@csupnigの答えは、それを想像して実装を書くことができれば機能しますが、同じインターセプター自体の範囲内でそれを行うことができました.追加サービスはありません.

これが私がそれをした方法です:

app.factory('httpResponseErrorInterceptor', function ($q, $injector) {
        return {
            responseError: function (response) {
                if(response.status === 500 && localStorage.getItem('token')) {
                var $http = $injector.get('$http');

                if(response.config.Retries===undefined){
                    //do something on first error e.g, reporting
                    response.config.Retries=1;
                    return $http(response.config);
                }else{
                    if(response.config.Retries!==2){
                        response.config.Retries = response.config.Retries +1;
                        return $http(response.config);
                    }
                    else{
                        response.config.Retries = undefined;
                        //do something on last retry
                        return $q.reject(response);
                    }
                }
            }
            return $q.reject(response); // give up
        }
    };
}); 

これは、応答構成自体にカウンターをアタッチすることで機能します。

これにはリファクタリングが必要になる可能性があることは認めますが、アイデアはわかります。これは私のユースケースでうまくいきました。これはかなり簡単に変更できると思います。

于 2015-11-13T08:41:23.440 に答える
0

カウンターは正しい解決策ですが、次のインターセプター呼び出しまで生き残るためには、カウンターをサービスに配置する必要があります。

リクエストと再試行のマップを管理するサービスを構築します。

于 2015-11-12T09:18:47.917 に答える