Angularjs 如何在$state change上使用promis取消所有挂起的$resource请求

Angularjs 如何在$state change上使用promis取消所有挂起的$resource请求,angularjs,angular-ui-router,ngresource,Angularjs,Angular Ui Router,Ngresource,当状态发生变化时,我正在尝试停止所有挂起的请求。下面的代码适用于$http,但不适用于$resource var cancel=$q.defer(); $http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror); function onsuccess(result) { console.log(r

当状态发生变化时,我正在尝试停止所有挂起的请求。下面的代码适用于$http,但不适用于$resource

                 var cancel=$q.defer();
    $http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror);

    function onsuccess(result) {
        console.log(result)
    }

    function onerror(error) {
        console.log(error)
    }


    function stopHttp() {
        $http.pendingRequests.forEach(function(request) {
            if (request.cancel) {
                request.cancel.resolve();
            }
        });
    }
但是这段代码不适用于$resource 下面是$resource的示例代码

             $resource(resourceUrl, {}, {
        'query': { method: 'GET', isArray: true,timeout:$q.defer().promise,cancel:$q.defer()},
        'get': {
            method: 'GET',
            transformResponse: function (data) {
                if (data) {
                    data = angular.fromJson(data);
                }
                return data;
            }
        },
        'update': { method:'PUT' }
    }); 

如何使用$resource停止所有请求我已经解决了这个问题。您必须为您的请求添加一个Cancelable:true,并使用$resource的$cancelRequest()方法在控制器中取消该请求

                 var cancel=$q.defer();
    $http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror);

    function onsuccess(result) {
        console.log(result)
    }

    function onerror(error) {
        console.log(error)
    }


    function stopHttp() {
        $http.pendingRequests.forEach(function(request) {
            if (request.cancel) {
                request.cancel.resolve();
            }
        });
    }
             $resource(resourceUrl, {}, {
        'query': { method: 'GET', isArray: true,timeout:$q.defer().promise,cancel:$q.defer()},
        'get': {
            method: 'GET',
            transformResponse: function (data) {
                if (data) {
                    data = angular.fromJson(data);
                }
                return data;
            }
        },
        'update': { method:'PUT' }
    }); 
例如,在你的情况下

$resource(resourceUrl, {}, {
    'query': { method: 'GET', isArray: true,cancellable:true},
    'get': {
        method: 'GET',
        transformResponse: function (data) {
            if (data) {
                data = angular.fromJson(data);
            }
            return data;
        }
    },
    'update': { method:'PUT' }
}); 
在你的控制器里

 var aborted= YourService.query();

//and later on state change

  $scope.$on('$stateChangeSuccess',function(event){
     aborted.$cancelRequest();
      }
      );

这只解决了特定控制器的问题。我想要的是立即取消$rootScope上的所有请求。但无论如何,非常感谢