0

我正在尝试“缓存”我的角度服务工厂。我希望它仅在第一次加载页面时使用缓存来访问 URL。然后,当我浏览到我的详细信息页面 (findById) 时,我想使用缓存。这有意义吗?

下面是我现在所拥有的,但我无法找到一种可靠的方法来处理这种异步。我的控制器正在调用服务。

angular.module('myapp.services', [])

.factory('myservice', function ($http, $q, $cacheFactory) {

    var url = '//myurl.com/getawesomeJSON';

    return {

        findAll: function () {

            var $httpDefaultCache = $cacheFactory.get('$http');

            var data = $httpDefaultCache.get(url);
            if (data == null) {
                data = $http.get(url, { cache: true });
            }

            var deferred = $q.defer();
            deferred.resolve(data);
            return deferred.promise;
        },

        findById: function (id) {

            var data = angular.fromJson($cacheFactory.get('$http').get(url)[1]);

            for (var i = 0; i < data.length; i++) {

                if (data[i].Id === parseInt(id)) {

                    var deferred = $q.defer();
                    deferred.resolve(data[i]);
                    return deferred.promise;
                }
            }
        }
    }
});
4

1 回答 1

1

由于您没有提供 plunker,因此我尚未对此进行测试,但是以下内容应该使您朝着正确的方向前进。您需要使用承诺链。

angular.module('myapp.services', [])

.factory('myservice', function ($http, $q, $cacheFactory) {

    var url = '//myurl.com/getawesomeJSON';

    return {

        findAll: function () {

            var $httpDefaultCache = $cacheFactory.get('$http');

            var deferred = $q.defer();

            var data = $httpDefaultCache.get(url);
            if (!data) {
                $http.get(url, { cache: true }).then(function(result){
                    deferred.resolve(result);
                });
            } else {
                deferred.resolve(data);
            }

            return deferred.promise;
        },

        findById: function (id) {
           return this.findAll().then(function(data) {
               for (var i = 0; i < data.length; i++) {
                  if (data[i].Id === parseInt(id)) {
                      return data[i];
                  }
              }
              return $q.reject('Not found'); // id not found
           });
        }
    }
});
于 2014-04-11T00:01:59.267 回答