召回拦截内的$ resource工厂

时间:2016-05-26 14:56:18

标签: javascript angularjs interceptor angular-resource angular-services

我有以下factory

.factory('Request', ['$resource', 'general',
        function ($resource) {
            return $resource(baseURL + ':resourceName/', {}, {
                get : {
                    method : 'GET',
                    isArray : true,
                    transformResponse : function (data, headers) {
                        return JSON.parse(data).data;
                    },
                    interceptor: {
                        responseError : function (data) {
                            gnrl.logIn({},false,function(){console.log("test");});
                            // ???? How to recall this request? 
                        }
                    }
                }
            });
        }
    ]);

我要做的是,如果用户在此请求中遇到一些问题,用户应该再次登录并再次执行请求。

请求工厂的调用如下:

Request.get(params, headers, function (res) {
    //does some operation with results  
});

我看过some related questions,但没有一个能完全符合我的情况。

1 个答案:

答案 0 :(得分:0)

使用问题中提到的答案解决。如上所述,主要想法是使用$promise而不是interceptor

我已经解决了以下问题:

以下是我服务中的功能

self.doRequest = function(nOfRetries, params, successFunction) {
        function fai(a) {
            nOfRetries--;
            self.logIn(function(){self.doRequest(nOfRetries);});
        }
        if (nOfRetries >= 0) {
            Request.get(params).then(successFunction).catch(fai);
        }
    }

Login只是同一服务中的另一个函数,作为回调函数,我向此函数发送请求。

doRequest的调用方式如下:

general.doRequest(3, params/*parameters used in request*/, function (res) {
            /***cb function for your initially request*/
});

最后,您会看到Request工厂:

.factory('Request', ['$resource',
        function ($resource) {
            var res = $resource(baseURL + ':resourceName/', {}, {
                    get : {
                        method : 'GET'
                    }
                });
            return {
                get : function (arguments) {
                    return res.get(arguments).$promise;
                }
            };
        }
    ])

请注意,doRequest's成功回调函数中发生的任何错误(服务器端或非服务器端)都将导致执行失败回调函数。