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