我有两个控制器,我们可以将它们称为controllerA和controllerB,它们都是从我通过观看指南和阅读的服务中共享数据。我不确定我所看到的是否正确,我可能需要提供商?
这是我的服务:
angular.service("getJson", ['$http','$q', function($http,$q){
var deferred = $q.defer();
this.data = "";
$http.get('test.json')
.then(function(data){
deferred.resolve(data);
});
this.getResource = function(){
console.log("hey this has loaded!");
return deferred.promise;
}
}]);`
然后在controllerA和ControllerB中加载我做的承诺。他们是一样的。
var jsonPromise = getJson.getResource();
jsonPromise.then(function(data){
$scope.rowData = data;
})
我在控制台日志中看到负载发生了两次!这是供应商的用途吗?难道没有办法说出来,"嘿,这已经加载了,而不是再次加载资源。"
答案 0 :(得分:0)
您可以在'getJson'服务方法中添加一些变量缓存。 第一次调用'getJson'方法时,'data'var将是未定义的,在这种情况下,数据将被加载。否则,返回可变数据。
快速举例:
angular.service('getJson', function($http,$q) {
// cache var
var data;
// service methods
return {
getResource: function(){
// create promise
var deferred = $q.defer();
/* check cache */
if(angular.isDefined(data)) {
deferred.resolve(data);
} else {
/* else load from http.get */
$http.get('test.json').then(function(response){
deferred.resolve(response);
data = response;
});
}
// return promise
return deferred.promise;
}
}
})
在同时调用相同的http.get时更新返回1的承诺
angular.service('getJson', function($http,$q) {
// cache var
var data;
var curProm;
var inProgress = false;
// service methods
return {
getResource: function(){
// check if in progress
if(inProgress) return curProm;
// create promise
var deferred = $q.defer();
/* check cache */
if(angular.isDefined(data)) {
deferred.resolve(data);
} else {
// set progress
inProgress = true;
curProm = deferred;
/* else load from http.get */
$http.get('test.json').then(function(response){
deferred.resolve(response);
data = response;
inProgress = false;
});
}
// return promise
return deferred.promise;
}
}
})