Я пытаюсь ответить на запрос $ 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;
}
Это создает пользовательский кеш, но нет данных в возвращаемом объекте. Теперь я знаю, что я не могу сохранить данные таким образом, но я не знаю, почему и как я буду заниматься этим.
Может ли кто-нибудь объяснить, как хранятся данные ответа? Где, если вообще, приходят ли сюда обещания?
Ваш оператор возврата выполняется до того, как код в вашей функции будет выполняться. Если вы хотите вернуть кеш, вы хотите запустить все через службу $ 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]);
});
Я адаптировал код из этого ответа: как получить данные по сервису и $ cacheFactory одним методом
Этот ответ просто делает прямой http.get. Если я понимаю, что вы делаете, у вас уже есть данные, вы отправляете их на свой сервер, и вы хотите избежать вызова, чтобы получить список, так как у вас есть его локально.