角度响应对象和存储数据

时间:2015-09-23 20:35:12

标签: angularjs caching

我正在尝试接受$ http请求的响应并将其保存到自定义缓存中。我想然后使用该缓存将数据显示到视图中。我认为在获取新数据之前会自动检查每个请求的缓存,但这对我来说似乎不起作用。

我遇到的问题是我似乎无法保存数据。以下功能需要发出2个请求:文章和图像。

getImages: function() {
                var cache = $cacheFactory('articlesCache');

                $http.get(posts) 
                .then(function (data) {
                    var articles = data;
                    angular.forEach(articles, function (article) {
                        var imageId = {id: article.image_id};
                        $http.post(images, imageId)
                        .then(function (response) {
                            article.image = response;
                            cache.put(article.url, article);
                        });
                    });
                });
                return cache;
            }

这会创建自定义缓存,但返回的对象中没有数据。我现在知道我无法以这种方式保存数据,但我不知道为什么或如何去做。

任何人都可以解释存储响应数据的工作原理吗?在哪里,如果有的话,使用承诺来到这里?

1 个答案:

答案 0 :(得分:0)

您的return语句在then函数中的代码执行之前执行。如果要返回缓存,则需要通过$ q服务运行所有内容,然后返回已解析的promise。

这可能不是使用$ cacheFactory的最佳方式。通常,您将缓存作为更高级别的服务公开,然后在需要时通过服务访问缓存。

因此,在您的主模块上,您可以创建缓存。

.factory('cache', function ($cacheFactory) {
var results = $cacheFactory('articleCache');
return results;
})

然后,您需要缓存,将其注入控制器并使用cache.get从中检索数据。

如果你想使用$ q来实现它,你的代码看起来就像下面的代码。 (免责声明:我从未使用$ q和$ cacheFactory这样,所以没有你所有的组件,我无法真正测试它,但这应该是接近的。)

var imageService = function ($http, $q,$cacheFactory) {

        var  imageFactory = {};
        imageService.cache = $cacheFactory('articlesCache');

        imageFactory.getImages = function () {
          var images = $q.defer();

      $http.get(posts) 
             .then(function (data) {
                var articles = data;
                angular.forEach(articles, function (article) {
                    var imageId = {id: article.image_id};
                    $http.post(images, imageId)
                    .then(function (response) {
                        article.image = response;
                        cache.put(article.url, article);
                    });
        images.resolve(cache.get('articlesCache'))
                });
            });
          return images.promise


app.factory('ImageService', ['$http', '$q', '$cacheFactory', imageService]);

});

我根据这个答案调整了代码:How to get data by service and $cacheFactory by one method

这个答案只是直接$ http.get。如果我了解你正在做什么,你已经有了数据,你将它发布到你的服务器上,你想避免接到电话来检索列表,因为你在本地拥有它。