如何通过一个方法按服务和$ cacheFactory获取数据

时间:2014-08-22 07:02:29

标签: angularjs

我有一个从服务器获取数据的工厂。在工厂方法中,我使用$ cacheFactory来缓存获取数据。我的代码如下..

    var buyersService = function ($http, $q,$cacheFactory) {
            var serviceBase = '/api/OMData/';
            var  BuyersFactory = {};
            buyersService.cache = $cacheFactory('cacheId');

            BuyersFactory.GetBuyers = function () {
              var dataList =  buyersService.cache.get('BuyerData');
              if (dataList != null && dataList.length > 0) {
                  return dataList;
              }
              else {
                  return $http.get(serviceBase + 'GetBuyers').then(
                   function (results) {
                       buyersService.cache.put("BuyerData", results.data);
                       return results.data;
                   });
              }

            }

    app.factory('OMDataService', ['$http', '$q', '$cacheFactory', buyersService]);

});

现在我从控制器调用了GetBuyers方法。我的方法如下。

  var BuyerController = function ($scope, BuyersService) {

        $scope.Buyers = [];
        init();
        function init() {
            getBuyers();
        }
        function getBuyers() {
            BuyersService.GetBuyers()
                .then(function (data) {
                    $scope.Buyers = data;
                }, function (error) {
                    alert(error.message);
                });
        }

    };
    app.register.controller('BuyersController', ['$scope', 'OMDataService', BuyerController]);

当我第二次执行控制器方法时,我在promise部分收到错误消息。 对象不支持属性或方法'然后'

1 个答案:

答案 0 :(得分:1)

这里的问题是你的函数返回两个不同的东西:promise或plain数据。要解决这个问题,请使用另一个promise来控制流程并返回该流程作为函数的结果。

将您的代码更新为

var buyersService = function ($http, $q,$cacheFactory) {
            var serviceBase = '/api/OMData/';
            var  BuyersFactory = {};
            buyersService.cache = $cacheFactory('cacheId');

            BuyersFactory.GetBuyers = function () {
              var buyersDataIsAvailable = $q.defer();
              var dataList =  buyersService.cache.get('BuyerData');
              if (dataList != null && dataList.length > 0) {
                  buyersDataIsAvailable.resolve(dataList);
              }
              else {
                  $http.get(serviceBase + 'GetBuyers').then(
                   function (results) {
                       buyersService.cache.put("BuyerData", results.data);
                       buyersDataIsAvailable.resolve(results.data);
                   });
              }
              return buyersDataIsAvailable.promise;
            }

    app.factory('OMDataService', ['$http', '$q', '$cacheFactory', buyersService]);

});