问题描述
请先通过代码
app.js
var app = angular.module('Nimbus', ['ngRoute']);
route.js
app.config(function($routeProvider) {
$routeProvider
.when('/login', {
controller: 'LoginController',
templateUrl: 'templates/pages/login.html',
title: 'Login'
})
.when('/home', {
controller: 'HomeController',
templateUrl: 'templates/pages/home.html',
title: 'Dashboard'
})
.when('/stats', {
controller: 'StatsController',
templateUrl: 'templates/pages/stats.html',
title: 'Stats'
})
}).run( function($q, $rootScope, $location, $route, Auth) {
$rootScope.$on( "$routeChangeStart", function(event, next, current) {
console.log("Started");
/* this line not working */
var canceler = $q.defer();
canceler.resolve();
});
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.title = ($route.current.title) ? $route.current.title : 'Welcome';
});
})
home-controller.js
home-controller.js
app.controller('HomeController',
function HomeController($scope, API) {
API.all(function(response){
console.log(response);
})
}
)
stats-controller.js
stats-controller.js
app.controller('StatsController',
function StatsController($scope, API) {
API.all(function(response){
console.log(response);
})
}
)
api.js
app.factory('API', ['$q','$http', function($q, $http) {
return {
all: function(callback) {
var canceler = $q.defer();
var apiurl = 'some_url'
$http.get(apiurl,{timeout: canceler.promise}).success(callback);
}
}
}]);
当我从家搬到 stats 时,API 会再次发送 http 请求,我有很多这样的 http 调用,我只粘贴了几行代码.
When I move from home to stats , again API will send http request, I have many http calls like this, I pasted only few lines of code.
我需要的是我需要在 routechangestart 或成功时中止所有待处理的 http 请求
What I need is I need to abort all pending http requests on routechangestart or success
或者任何其他实现相同的方式?
Or any other way to implement the same ?
推荐答案
我为此整理了一些概念性代码.它可能需要调整以满足您的需求.有一个 pendingRequests
服务,它有一个 API 用于添加、获取和取消请求,一个 httpService
包装 $http
并确保跟踪所有请求.
I put together some conceptual code for this. It might need tweaking to fit your needs. There's a pendingRequests
service that has an API for adding, getting and cancelling requests, a httpService
that wraps $http
and makes sure all requests are tracked.
通过利用 $http
配置对象(docs),我们可以获得取消待处理请求的方法.
By leveraging the $http
config object (docs) we can get a way to cancel a pending request.
我已经做了一个 plnkr,但是你需要快速的手指才能看到请求被取消,因为我发现的测试站点通常会在半秒内响应,但是你会在 devtools 网络选项卡中看到请求被取消.在您的情况下,您显然会在来自 $routeProvider
的适当事件上触发 cancelAll()
调用.
I've made a plnkr, but you're going to need quick fingers to see requests getting cancelled since the test-site I found typically responds within half a second, but you will see in the devtools network tab that requests do get cancelled. In your case, you would obviously trigger the cancelAll()
call on the appropriate events from $routeProvider
.
控制器只是为了演示这个概念.
The controller is just there to demonstrate the concept.
angular.module('app', [])
// This service keeps track of pending requests
.service('pendingRequests', function() {
var pending = [];
this.get = function() {
return pending;
};
this.add = function(request) {
pending.push(request);
};
this.remove = function(request) {
pending = _.filter(pending, function(p) {
return p.url !== request;
});
};
this.cancelAll = function() {
angular.forEach(pending, function(p) {
p.canceller.resolve();
});
pending.length = 0;
};
})
// This service wraps $http to make sure pending requests are tracked
.service('httpService', ['$http', '$q', 'pendingRequests', function($http, $q, pendingRequests) {
this.get = function(url) {
var canceller = $q.defer();
pendingRequests.add({
url: url,
canceller: canceller
});
//Request gets cancelled if the timeout-promise is resolved
var requestPromise = $http.get(url, { timeout: canceller.promise });
//Once a request has failed or succeeded, remove it from the pending list
requestPromise.finally(function() {
pendingRequests.remove(url);
});
return requestPromise;
}
}])
// The controller just helps generate requests and keep a visual track of pending ones
.controller('AppCtrl', ['$scope', 'httpService', 'pendingRequests', function($scope, httpService, pendingRequests) {
$scope.requests = [];
$scope.$watch(function() {
return pendingRequests.get();
}, function(pending) {
$scope.requests = pending;
})
var counter = 1;
$scope.addRequests = function() {
for (var i = 0, l = 9; i < l; i++) {
httpService.get('https://public.opencpu.org/ocpu/library/?foo=' + counter++);
}
};
$scope.cancelAll = function() {
pendingRequests.cancelAll();
}
}]);
这篇关于AngularJS 在路由更改时中止所有挂起的 $http 请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!