是否可以在 Angular 中的所有 http 调用之前检查条件?
Is it possible to check condition before all http calls in Angular?
是否可以检查:$rootScope.variable is TRUE
在调用所有 $http
个调用之前,还是我应该检查每个单独的调用?我的一些电话是通过 angular factory
拨打的,有些则不是。
我认为可能有一些方法,比如 httpInterceptor,它会在某些调用之前进行检查 运行。
如有任何帮助,我们将不胜感激。
您可以为这个问题创建一个 interceptor,如下所示:
angular.module('myModule', []).config(function($httpProvider) {
$httpProvider.interceptors.push(function($rootScope) {
return {
'request': function(config) {
if($rootScope.yourVariable) {
// cancel this request
}
}
}
});
})
此拦截器处理每个请求。您可以找到取消请求的实现 here
进一步@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');
}
这里分离的比较多。您可以看到如何轻松地将更多拦截器推送到管道中。显然,您可以像 $rootScope
一样将您喜欢的任何东西注入 httpInterceptorService
。
请注意不要创建任何循环依赖项。
我喜欢@pankajparkar 评论的内容,维护适当的调用堆栈。
您可以这样做而不是使用拦截器(因为它们针对每个请求)。
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.
});
}
是否可以检查:$rootScope.variable is TRUE
在调用所有 $http
个调用之前,还是我应该检查每个单独的调用?我的一些电话是通过 angular factory
拨打的,有些则不是。
我认为可能有一些方法,比如 httpInterceptor,它会在某些调用之前进行检查 运行。
如有任何帮助,我们将不胜感激。
您可以为这个问题创建一个 interceptor,如下所示:
angular.module('myModule', []).config(function($httpProvider) {
$httpProvider.interceptors.push(function($rootScope) {
return {
'request': function(config) {
if($rootScope.yourVariable) {
// cancel this request
}
}
}
});
})
此拦截器处理每个请求。您可以找到取消请求的实现 here
进一步@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');
}
这里分离的比较多。您可以看到如何轻松地将更多拦截器推送到管道中。显然,您可以像 $rootScope
一样将您喜欢的任何东西注入 httpInterceptorService
。
请注意不要创建任何循环依赖项。
我喜欢@pankajparkar 评论的内容,维护适当的调用堆栈。
您可以这样做而不是使用拦截器(因为它们针对每个请求)。
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.
});
}