Угловые ответные объекты и хранение данных

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;
            }

Это создает пользовательский кеш, но нет данных в возвращаемом объекте. Теперь я знаю, что я не могу сохранить данные таким образом, но я не знаю, почему и как я буду заниматься этим.

Может ли кто-нибудь объяснить, как хранятся данные ответа? Где, если вообще, приходят ли сюда обещания?

Теги:
caching

1 ответ

0

Ваш оператор возврата выполняется до того, как код в вашей функции будет выполняться. Если вы хотите вернуть кеш, вы хотите запустить все через службу $ 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. Если я понимаю, что вы делаете, у вас уже есть данные, вы отправляете их на свой сервер, и вы хотите избежать вызова, чтобы получить список, так как у вас есть его локально.

  • 0
    Спасибо за ответ. В приложении я использую пользовательский cacheFactory в точности так, как вы обрисовали, но для краткости и ясности это изменилось в приведенном выше фрагменте кода. Как бы я запустил это через сервис $ q?
  • 0
    Конечно, я обновлю ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню