angularjs - 带有 $httpProvider 和 Promise 的 Angular.js 代码。它有什么作用?

标签 angularjs httpresponse interceptor promise

您能大致解释一下这段代码的作用吗:

App.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.responseInterceptors.push('HttpSpinnerInterceptor');
  $httpProvider.defaults.transformRequest.push(function (data, headersGetter) {
    angular.element('.brand img').attr("src","<%= asset_path('brand/brand.gif') %>");
    return data;
  });
}]);

App.factory('HttpSpinnerInterceptor', function ($q, $window) {
  return function (promise) {
    return promise.then(function (response) {
      angular.element('.brand img').attr("src","<%= asset_path('brand/brand.png') %>");
      return response;
    }, function (response) {
      angular.element('.brand img').attr("src","<%= asset_path('brand/brand.png') %>");
      return $q.reject(response);
    });
  };
});

我完全不理解,除了一些猜测它拦截了一些响应并注入(inject)图像的 src 属性。

我不明白 HttpSpinnerInterceptor 是如何以及何时被调用的,以及“promise”参数是什么。

最佳答案

  1. HttpSpinnerInterceptor 在使用 $http 服务发出的每个请求完成(成功与否)之后、但在向调用者解析 Promise 之前(因此您可以推迟结果)被调用。实际上不需要转换请求,因为它基本上与 HttpSpinnerInterceptor 相同(或者不需要 HttpSpinnerInterceptor...),因为它不转换任何内容。

  2. promise 参数是一个 $q promise ,如果您需要在获得请求结果时执行一些异步操作,则可以使用该 promise 稍后重新调整它,以便调用者稍后会得到结果。实际上,在您的代码中,您可以直接解决此 promise (或拒绝它),从而更改图像的 src 属性。

以下是一些文档链接:

  1. 使用$http服务:http://docs.angularjs.org/api/ng.$http - 仔细查看“响应拦截器”和“转换请求和响应
  2. AngularJS 中的 Promise:http://docs.angularjs.org/api/ng.$q

关于angularjs - 带有 $httpProvider 和 Promise 的 Angular.js 代码。它有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629105/

相关文章:

c# - 如果在迭代 IEnumerable 时出现异常(从 Controller 返回),AspNet.Core 将返回 200 OK and invalid Json

javascript - Axios 拦截器请求在 VueJs 中过期时刷新 id token

javascript - 绑定(bind)输入并选择一个 ng-model

javascript - Angular $http无法发送内容类型 header

javascript - 这个例子中 "main" Controller 是如何访问$routeParams的?

jakarta-ee - 参数拦截器在 Java EE 中不起作用

unity-container - 升级 Unity 容器会破坏拦截机制

javascript - 仅使用对该对象的引用替换数组中的对象

javascript - Nodejs 响应中的变量范围

android - Logcat 在每次 DefaultHttpClient 执行方法调用期间打印 "interface name: null"