2014-12-08 4 views
5

У меня есть приложение AngularJS, и я хочу кэшировать ответы службы REST. Я нашел некоторые библиотеки, такие как angular-cached-resource, которые могут сделать это, сохранив данные в локальном хранилище веб-браузера.Стратегия кэша службы REST с AngularJS

Но иногда я выполняю вызовы POST/PUT/DELETE REST, а затем некоторые из предыдущих запросов кэша службы REST необходимо выполнить снова. Таким образом, кажется, что можно удалить кешированные ответы, а затем вызов будет отправлен на сервер в следующий раз.

Но как насчет того, посылает ли сервер в HTTP Header некоторые значения, такие как expires или etag? Я должен прочитать HTTP-заголовок и отреагировать сам или есть библиотека в AngularJS, которая также может справиться с этим?

Поэтому, если я должен ударить по серверу и не читать кеш локального хранилища, зависит от полей кэша заголовка HTTP и если есть какие-либо вызовы PUT/POST/DELETE, которые имеют ответ, например, «перезагрузка каждого элемент пользовательских настроек ". Поэтому я должен принять этот ответ и создать карту, которая говорит мне, что, например, REST-сервисы A, C и F (связанные с настройками параметров пользователя) должны снова попасть на сервер в следующий раз, когда они будут выполнены, или если Cache истекает из HTTP Заголовки.

Возможно ли это с помощью библиотеки AngularJS или у вас есть другие рекомендации? Я думаю, что это похоже на Observer или PubSub Pattern, не так ли?

Еще одна вещь: Возможно ли иметь что-то вроде PubSub без использования кеша/локального хранилища (так же, как и управления кэшем заголовка HTTP)? Поэтому я не могу вызвать службу REST, потому что тогда она попадет на сервер, чего я не хочу в некоторых случаях (ответ от предыдущего вызова REST, который возвращает мне событие «перезагрузка каждого элемента пользовательских настроек»).

+0

Вы можете сделать это с помощью паба/подпрограммы. Пожар события с ответом возвращается из запроса post/put/del, а слушатели в сервисах ждут их, затем выполняют запрос GET. – reptilicus

+0

Да, но, возможно, мне не нужно немедленно звонить с REST, потому что элемент страницы, который необходимо перезагрузить, не отображается/на той же веб-странице. – Tim

+0

То, как мы это делаем, - это прослушивание события в службе, например userOptionsService, и когда отправляется POST, выполните перезагрузку в userOptionsService, а затем в контроллере загрузите данные, которые хранятся в userOptionsService.userOptions – reptilicus

ответ

0

Вы можете попробовать что-то вроде этого.

app.factory('requestService', ['$http', function ($http) { 

    var data = {}; 

    var service = { 
     getCall : funtion(requstUrl, successCallback, failureCallback, getFromCache){ 
        if(!getFromCache){ 
         $http.get(requstUrl) 
          .success(function(data){ 
           successCallback(data); 
           data.requstUrl = data; 
          }) 
          .error(function(){ 
           failureCallback(data); 
          }) 
        }else{ 
         successCallback(data.requstUrl); 
        } 
       }, 
     postCall : function(requestUrl, paramToPass, successCallback, failureCallback, getFromCache){ 
        if(!getFromCache){ 
         $http.post(requestUrl, paramToPass) 
          .success(function(data){ 
           successCallback(data); 
           data.requstUrl = data; 
          }) 
          .error(function(data){ 
           failureCallback(data); 
          }) 
        }else{ 
         successCallback(data.requstUrl); 
        } 
     } 
    }; 

    return service; 
}]); 

Это простой код, который я написал для реализации вашей концепции. Я не тестировал его и все твое.

Смежные вопросы