共享的 AngularJS $http拦截器

Shared AngularJS $http interceptors

本文关键字:http AngularJS 共享      更新时间:2023-09-26

我想知道Angular.js $http拦截器是否在整个应用程序中共享。
假设我有一个myDependentApp模块,在许多应用程序之间共享。该模块配置了一些拦截器来控制$http请求/响应。我通过在应用程序引导程序中声明该模块来包含该模块:

angular.module('myApp', ['myDependentApp']);

我有应用程序模板:

<html ng-app="myApp">

myDependentApp的拦截器会在myApp活跃吗?

感谢您的帮助。

答案是肯定的,我在这里试过:

var dependentApp = angular.module('dependency',[]).config(['$httpProvider', function($httpProvider) {
    $httpProvider.interceptors.push(function ($q) {
        return {
            'request': function (config) {
                console.log('request intercept');
            },
                'response': function (response) {
                console.log('response intercept');
            }
        };
    });
}]);
var app = angular.module('myapp', ['dependency']);
app.controller('mycontroller', ['$scope', '$http', function ($scope, $http) {
    $http.get('http://www.google.com');
}]);

我看到请求被拦截了。这是小提琴:http://jsfiddle.net/6dbgo6pt/1/

答案是肯定的。

直接来自文档

角度服务是:

延迟实例化 – Angular 仅在应用程序组件依赖于服务时才实例化服务。

单一实例 – 依赖于服务的每个组件都获取对服务工厂生成的单个实例的引用。

$http就是这样一种使用提供程序配方的服务创建广告。

因此,这意味着应用程序中的每个模块都将提供相同的$http服务,并且添加拦截器的模块将与模块共享,因为$http服务与任何其他使用.service.factory.provider的角度或自定义构建服务一样是一个单例。

$http 拦截器:

出于全局错误处理、身份验证或请求的任何类型的同步或异步预处理或响应的后处理的目的,希望能够在请求传递给服务器之前截获请求,并在将响应移交给发起这些请求的应用程序代码之前截获响应。拦截器利用承诺 API 来满足同步和异步预处理的这一需求。

侦听器是通过将它们添加到 $httpProvider.interceptors 数组来向$httpProvider注册的服务工厂。调用工厂并注入依赖项(如果指定)并返回拦截器。

$httpProvider:

使用 $httpProvider 更改$http服务的默认行为。