是否可以检查:$rootScope.variable is TRUE
在调用所有$http
来电之前,还是应该检查每个电话?我的一些电话是通过角度factory
来调用的,有些则不是。
我认为可能有某种方式像httpInterceptor,它会在某些调用运行之前检查。
任何帮助都会受到赞赏。
答案 0 :(得分:3)
您可以为此问题创建interceptor,如下所示:
angular.module('myModule', []).config(function($httpProvider) {
$httpProvider.interceptors.push(function($rootScope) {
return {
'request': function(config) {
if($rootScope.yourVariable) {
// cancel this request
}
}
}
});
})
此拦截器处理每个请求。您可以找到取消请求的实现here
答案 1 :(得分:1)
进一步了解@ boindiil的回答。我倾向于这样:
angular.module('someModule', [])
.factory('httpInterceptorService', ['$q', httpInterceptorService])
.config(['$httpProvider', interceptorConfig]);
function httpInterceptorService($q) {
var service = {
request: request,
responseError: responseError
};
return service;
function request(config) {
// do some logic
return config;
}
function responseError(rejection) {
if (rejection.status === 401) {
// they were unauthorised.
}
return $q.reject(rejection);
}
}
function interceptorConfig ($httpProvider) {
$httpProvider.interceptors.push('httpInterceptorService');
}
这里更加分离。您可以看到如何轻松地将更多拦截器推入管道。显然,您可以像httpInterceptorService
一样将$rootScope
注入到angular.module('someModule', [])
.factory('mainService', ['$http', '$rootScope', '$q', mainService])
.controller('MainCtrl', ['mainService', mainCtrl]);
function mainService($http, $rootScope, $q) {
var service = {
getThings: getThings
};
var serviceBase = '/Api/Things';
return service;
function getThings() {
var deferred = $q.defer();
$http.get(serviceBase).then(function (data) {
if (data.data.someVariable == $rootScope.someVariable) {
deferred.resolve(data.data);
} else {
deferred.reject(data);
}
}).catch(function (message) {
deferred.reject(message);
});
return deferred.promise;
}
}
function mainCtrl(mainService) {
var vm = this;
vm.httpData = {};
mainService.getThings().then(function (data) {
vm.httpData = data;
}, function (message) {
// do something with the error.
});
}
中。
请注意不要创建任何循环依赖项。
我喜欢@pankajparkar评论的内容,维护一个正确的调用堆栈。
您可以这样做而不是使用拦截器(因为它们适用于每个请求)。
{{1}}