调用工厂函数一次



我有这个工厂,它被指令多次调用。由于它返回了大量数据,所以最后的渲染速度很慢。我怎么能只叫一次,或者在第二次叫n次时把它存到现金里?

appBMdata.factory('Trends',['$http','Config','$q',
    function($http,Config,$q){

           function getAllData() {
            var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016');
            var source2 = $http.post(Config.api_server + 'trends');
            return $q.all([source1, source2]);
          };
          return {
            getAllData : getAllData,
          };     
  }]);

您可以将promise保存在var中,并在已经设置的情况下返回:

appBMdata.factory('Trends',['$http','Config','$q',
  function($http,Config,$q){
         var _cacheGetAllData;
         function getAllData() {
          var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016');
          var source2 = $http.post(Config.api_server + 'trends');
          _cacheGetAllData = _cacheGetAllData || $q.all([source1, source2]);
          return _cacheGetAllData;
        }
        return {
          getAllData : getAllData,
        };     
}]);

如果您希望连续调用强制更新,您可以将其编辑为以下内容:

appBMdata.factory('Trends',['$http','Config','$q',
  function($http,Config,$q){
    var _cacheGetAllData;
    function getAllData(ignoreCache) {
      var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016');
      var source2 = $http.post(Config.api_server + 'trends');
      if (ignoreCache) {_cacheGetAllData = undefined;}
      _cacheGetAllData = _cacheGetAllData || $q.all([source1, source2]);
      return _cacheGetAllData;
    }
    return {
      getAllData : getAllData,
    };     
}]);

我在服务中解析它,然后存储数据,如果它有数据,则在promise中返回数据。如果您想再次获取数据,只需添加true作为第一个自变量。

appBMdata.factory('Trends', ['$http', 'Config', '$q', function($http, Config, $q) {
    var data;
    function getAllData(nocache) {
        var deferred = $q.defer();
        if (data.length && !nocache) {
           deferred.resolve(data);
        } else {
            var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016');
            var source2 = $http.post(Config.api_server + 'trends');
            $q.all([source1, source2])
                .then(function (values) {
                    data = values;
                    deferred.resolve(data);
                })
                .catch(function (err) {
                    deferred.reject(err);
                });
        }
        return deferred.promise;
    }
    return {
        getAllData : getAllData
    };
}]);

是的,您可以将数据保留在$rootScope上,并在多次调用时从那里返回数据。

appBMdata.factory('Trends',['$http','Config','$q','$rootScope'
    function($http,Config,$q,$rootScope){

           function getAllData() {
            var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016');
            var source2 = $http.post(Config.api_server + 'trends');
            return $q.all([source1, source2]);
          };
          if($rootScope.data){             // check if data already present
            $rootScope.data=getAllData();    // assign data to rootscope
          }
          return {
           getAllData : $rootScope.data,   //return data from rootscope
          };
  }]);

最新更新