angular $ http服务单身冲突

时间:2015-08-01 05:18:55

标签: ajax angularjs

$ angular中的$ http服务是单身,我之前使用xhr / ajax请求的经验显示,当两个请求共享相同的xhr对象时会发生冲突。角度不应该有问题吗?如果是,角度如何处理这种情况?

2 个答案:

答案 0 :(得分:0)

$ http请求是异步的,并返回带有方法success()和error()的promise。下面是更多信息($ q服务,这是Angularjs承诺的实现):

“一种服务,可以帮助您异步运行函数,并在完成处理后使用它们的返回值(或异常)”

请阅读:

答案 1 :(得分:0)

我认为你误解了这样一个事实:$http服务是一个单例,意味着所有请求都会以某种方式共享同一个XHR对象。他们没有。

$http服务本身是一个单例,但这并不意味着请求共享相同的XHR对象。

无论何时调用$http服务方法(例如$http#get),它都会初始化一个新的异步请求......但是,它不会初始化一个新的$http对象。

查看单例模式的一些Addy Osmani's示例代码:

  return {
    getInstance: function () {

      if ( !instance ) {
        instance = init();
      }

      return instance;
    }
  };

单例模式只是确保$http服务本身的新实例不会一遍又一遍地被初始化......但意味着只有一个XHR对象。

$http服务的伪代码看起来像这样:

var $httpProvider = (function() {
  var somePrivateConfig = "something important";

  var service = {
    request: function() {
      // make an HTTP request with an XHR object
    }
  };

  return {
    init: function() {
      // this is the important part that makes sure its a singleton
      window.$http = window.$http || service;
    }
  };

})();

/**
 * Something like this would be called whenever you
 * inject the $http service as a dependency... 
 * However, since it could be passed into multiple things all in the same runtime,
 * like controllers, directives, etc., we only need to initialize it ONE time
 */
$httpProvider.init();

/**
 * Now let's pretend we're inside, say, a controller.
 *
 * This method can safely be called many times,
 * but the method is always being called from the same singleton object
 */
$http.request();  

另外,您会注意到somePrivateConfig IIFE中存在局部变量$httpProvider。如果我们每次注入一个组件时重新初始化一个新的$http(无论是控制器,指令还是其他),都会创建一个新的私有变量,但我们总是希望引用它在$http对象的整个生命周期中的值,以便我们可以保证所有这些组件始终引用相同的信息。

但这与XHR对象本身无关。我可能误用了上面的一些术语,并且误解了AngularJS上下文中提供者本身的位置和方式被初始化为单例对象,但单例模式的原理仍然在于它仅仅意味着异步请求包装器“类”(其中)是$http服务)是单身,但XHR不是。