调用工厂功能一次

时间:2016-08-02 10:26:47

标签: javascript angularjs

我有这个工厂,它被指令多次调用。由于它返回大量数据,因此最终的渲染速度很慢。如何在第二次和第二次调用时将其称为一次或将其保存在cashe中?

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,
          };     
  }]);

3 个答案:

答案 0 :(得分:1)

您可以在var中保存promise,如果已经设置,则返回它:

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,
    };     
}]);

答案 1 :(得分:1)

是的,您可以将数据保存在$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
          };
  }]);

答案 2 :(得分:1)

我在服务中解析它,然后存储数据,如果它有数据,则在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
    };

}]);