2015-09-23 42 views
0

我试图采取$ 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; 
      } 

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

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

回答

0

您的return语句在您的then函数中的代码执行之前执行。如果你想返回缓存,你会想通过$ q服务来运行所有的东西,然后返回已解决的承诺。

这可能不是使用$ 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虽然。如果我明白你在做什么,你已经有了这些数据,你将它发布到你的服务器上,并且你想避免打电话来检索列表,因为你在本地拥有它。

+0

感谢您的反馈意见。在应用程序中,我使用的是自定义的cacheFactory,正如您所概述的那样,但为了简洁和清晰起见,已在上面的代码段中进行了更改。我如何通过$ q服务来运行这个? – Proto

+0

当然我会更新答案。 –