Angular $ HTTP错误处理程序

时间:2015-12-22 15:23:35

标签: angularjs http error-handling

下面是一个非常原始的方式的例子,我正在处理一个花费太长时间的HTTP调用。

如果超过3秒钟,重新开火,如果失败4次则退出。

虽然它有效,但我不希望创建这样的每个HTTP请求,因为一个调用的代码太多了。

有没有办法全球应用?

我不确定拦截器是否适用于这种情况,因为我需要在HTTP调用花费太长时间后启动错误句柄,而不是从服务器收到错误响应时。

我还需要将其应用于部分视图请求。

代码:

     var errorCount = 0;           

            function someFunction() {

               var startTime = new Date().getTime();

               var deferred = $q.defer();

               var url = 'some url';

               $http.get(url, {cache: true, timeout: 3000}).success(function(response) {

                deferred.resolve(response);

            }).error(function(result, status, header, config) {

                var respTime = new Date().getTime() - startTime;

                  if( respTime >= config.timeout ){

                        errorCount +=1;

                        if ( errorCount > 3) {

                            errorCount = 0;

                            deferred.reject(result);

                        } else {

                            getCountries();
                        };

                    } else{

                        deferred.reject(error);

                    };

            });

            return deferred.promise;

        };

1 个答案:

答案 0 :(得分:0)

好的,这就是我最终做的事情。

可能不是最好的方式,但也许有人会发现它也很有用!

因此,使用拦截器我将所有传出的HTTP请求配置为在3秒后中止,并配置任何状态为' abort' (我认为这是' -1'的状态)重试3次。

代码:

(function() {
'use strict';

angular
    .module('InterceptModule', []);

angular
    .module('InterceptModule')
    .factory('myInterceptor', myInterceptor);


myInterceptor.$inject = ['$q', '$injector','$cookies']


function myInterceptor($q,$injector,$cookies) {

    var errorCount = 0;

    var service = {

        responseError: responseError,
        request      :  request

    };

    return service;


    //////////

    /* this function is where tell the request to re-fire if it
     * has been aborted.
     *
    */

    function responseError(response) {

            if ( response.status == -1 ) {

                var deferred = $q.defer();

                var firstResponse = response;

                var url = response.config.url;

                var $http = $injector.get('$http');

                    $http.get(url, {cache: true}).then(function(response) {

                        deferred.resolve(response);

                    }, function(result, status, header, config) {

                        if ( status == -1 ) {

                            errorCount += 1;

                            if ( errorCount > 3 ) {

                                errorCount = 0;

                                deferred.reject(result);

                            } else {

                                responseError(firstResponse);

                            }

                        };

                        deferred.reject(result);

                    });



                return deferred.promise;

            };/* if */


            return $q.reject(response);


    };


   /** 
     * this function is where we configure our outgoing http requests
     * to abort if they take longer than 3 seconds.
     *
    */

    function request(config) {

            config.timeout = 3000;

        return config;

    };




}/* service */      


})();

注入我们的拦截模块

angular
    .module('myApp', ['InterceptModule']);

然后在我们的配置中推送我们的拦截器

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