我正在尝试接受$ 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 :(得分: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。如果我了解你正在做什么,你已经有了数据,你将它发布到你的服务器上,你想避免接到电话来检索列表,因为你在本地拥有它。