在两个角度1控制器之间加载服务json的正确方法(仅需要加载资源一次)

时间:2016-07-20 19:54:44

标签: angularjs json service

我有两个控制器,我们可以将它们称为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;
})

我在控制台日志中看到负载发生了两次!这是供应商的用途吗?难道没有办法说出来,"嘿,这已经加载了,而不是再次加载资源。"

1 个答案:

答案 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;
        }
    }
})