Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在angular js中中止/取消/放弃http请求,然后重试_Angularjs_Http_Xmlhttprequest_Interceptor_Abort - Fatal编程技术网

Angularjs 在angular js中中止/取消/放弃http请求,然后重试

Angularjs 在angular js中中止/取消/放弃http请求,然后重试,angularjs,http,xmlhttprequest,interceptor,abort,Angularjs,Http,Xmlhttprequest,Interceptor,Abort,我正在开发一个应用程序,在该应用程序中,如果某个时间过去了,我必须停止侦听请求,就像如果在60秒内请求没有响应,那么我必须中止该请求,并且一次有多个请求。我不知道如何使用中止时间(60秒)跟踪每个请求。我的意思是我怎么知道哪个请求要中止 我想在我的AngularJS拦截器中实现这个功能。我尝试了很多博客和帖子,声称实现了这个功能,但没有任何帮助 这是我的截取代码 $httpProvider.interceptors.push(['$cookies', '$rootScope', '$q'

我正在开发一个应用程序,在该应用程序中,如果某个时间过去了,我必须停止侦听请求,就像如果在60秒内请求没有响应,那么我必须中止该请求,并且一次有多个请求。我不知道如何使用中止时间(60秒)跟踪每个请求。我的意思是我怎么知道哪个请求要中止

我想在我的AngularJS拦截器中实现这个功能。我尝试了很多博客和帖子,声称实现了这个功能,但没有任何帮助

这是我的截取代码

    $httpProvider.interceptors.push(['$cookies', '$rootScope', '$q', '$localStorage', '$sessionStorage','$timeout', function ($cookies, $rootScope, $q, $localStorage, $sessionStorage, $timeout) {
        return {
            'request': function (config) {
                config.headers = config.headers || {};
                if (typeof config.data !== 'object') {
                    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
                }
                config.headers.Accept = 'application/json;odata=verbose';
                config.headers['X-Requested-With'] = 'XMLHttpRequest';
                var token = $localStorage.authToken || $sessionStorage.authToken;                    
                if (token) {
                    config.headers.Authorization = 'Bearer ' + token;
                }

                return config;
            },
            'responseError': function (response) {
                var status = response.status;
                var error = '';
                if(response.data.error) {
                    error = response.data.error;
                }
                if(status === 401) {
                    $rootScope.unauthorizedLogout();
                } else if(status === 400 && (error === 'token_invalid' || error === 'token_not_provided')) {
                    $rootScope.unauthorizedLogout();
                } 
                return $q.reject(response);
            }
        };
    }]); 
我确实尝试了
$q.defer
,它是取消请求的解析方法,但它不能帮助我在应用程序中实现所需的功能


和平解决V

您可以尝试使用 $httpProvider.defaults.timeout

angular.module('test', [])
  .config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.timeout = 60000;
}]);

将递增的超时值设置为请求

    config.timeout = incrementalTimeout;
处理响应错误的拦截器应该如下所示

   'responseError': function (response) {
    var status = response.status;
    var error = '';
    //functionality to for request aborting and resending
    if (status === -1 || status >= 500) {
        if (attempts <= 3) {
            attempts += 1;
            return retryRequest(response.config);
        }
    } else {
        // set incrementalTiemout and attempts to default value   
        incrementalTimeout = 4000;
        attempts = 1;
    }
    if(response.data.error) {
        error = response.data.error;
    }
    if(status === 401) {
        $rootScope.unauthorizedLogout();
    } else if(status === 400 && (error === 'token_invalid' || error === 'token_not_provided')) {
        $rootScope.unauthorizedLogout();
    }
    return $q.reject(response);
}

这个答案对你有帮助吗?是的,我已经试过了。谢谢,但是我怎么会再次发送那个请求,而且它也不起作用。虽然我尝试设置
config.timeout=1000
,但效果不错。似乎angular正在忽略默认超时您可以在拦截器的“responseError”函数中重新发送超时请求$超时(函数(){/*重新发送请求*/},1000);好的,但是我们怎么知道要再次发送哪个请求,因为在给定的时间有多个请求正在发生。我想我必须试试这个。。。希望对我有用
        // default request timeout is of 4 seconds and attempt is 1
        var incrementalTimeout = 4000;
        var attempts = 1;
        function retryRequest (httpConfig) {
            var thisTimeout = incrementalTimeout;
            incrementalTimeout += 1000;
            return $timeout(function() {
                var $http = $injector.get('$http');
                return $http(httpConfig);
            }, thisTimeout);
        }