Javascript 如何创建只发出一次http请求的angular js服务
我有以下angularjs服务Javascript 如何创建只发出一次http请求的angular js服务,javascript,angularjs,Javascript,Angularjs,我有以下angularjs服务 var assetLookUpTransformService = function($http, $q) { this.data = null; var self = this; this.doStuff = function() { var defer = $q.defer(); if (self.data) { defer.resolve(self.data[0].DisplayName); } else {
var assetLookUpTransformService = function($http, $q) {
this.data = null;
var self = this;
this.doStuff = function() {
var defer = $q.defer();
if (self.data) {
defer.resolve(self.data[0].DisplayName);
} else {
$http({
url: '../AssetLookup/GetAssetLookUp',
method: "GET"
}).success(function(response) {
self.data = response;
defer.resolve(self.data[0].DisplayName);
});
}
return defer.promise;
}
}
它可以正常工作,因为一旦$http请求返回了对“doStuff”的所有后续调用,就会从数据返回数据,而不是发出新的请求
然后我的问题是,在页面加载时,我会在对方之后打一大堆电话。现在发生的是,对doStuff的第一个调用将发出$http请求,但在第一个http请求返回之前对doStuff的任何调用也将发出$http请求
是否有一种方法可以调用doStuff“等待”未完成的$http请求返回,然后再调用doStuff
或者有没有办法确保$http请求只发生一次?缓存承诺,而不是数据。数据被封装在promise中,并将始终返回给任何请求它的对象
var assetLookUpTransformService = function($http, $q) {
var self = this;
this.doStuff = function() {
if (!self.deferred) {
self.deferred = $q.defer();
$http({
url: '../AssetLookup/GetAssetLookUp',
method: "GET"
}).success(function(response) {
self.deferred.resolve(response[0].DisplayName);
});
}
return self.deferred.promise;
}
}
你为什么不在第一次打电话给多斯塔夫之后再打这些电话呢 例如:
this.doStuff = function(afterRequests) {
var defer = $q.defer();
if (self.data) {
defer.resolve(self.data[0].DisplayName);
} else {
$http({
url: '../AssetLookup/GetAssetLookUp',
method: "GET"
}).success(function(response) {
self.data = response;
defer.resolve(self.data[0].DisplayName);
//make each request in here.
afterRequests.forEach(function(request) {
$http(request).success(function(response) {
//use self.data here
});
});
});
}
return defer.promise;
}
如果出于某种原因,您必须同时制作doStuff(例如,它运行时间很长),那么您可以使用$rootScope.$broadcast以可能需要渲染数据的控制器为目标