2014-12-08 20 views
5

Ho un'applicazione AngularJS e voglio memorizzare nella cache le risposte del servizio REST. Ho trovato alcune librerie come angular-cached-resource che possono farlo memorizzando i dati nella memoria locale del browser web.Strategia cache servizio REST con AngularJS

Ma a volte eseguo alcune chiamate POST/PUT/DELETE REST e quindi alcune delle risposte del servizio REST precedentemente memorizzate devono essere eseguite nuovamente. Quindi sembra che sia possibile eliminare le risposte memorizzate nella cache e la chiamata verrà inviata al server la volta successiva.

Ma cosa succede se il server mi invia in HTTP Header alcuni valori come lo expires o lo etag? Devo leggere l'intestazione HTTP e reagire da solo o c'è una libreria in AngularJS che può gestire anche questo?

Quindi se dovessi colpire il server e non leggere la cache della memoria locale dipende dai campi della cache dell'intestazione HTTP e se ci sono chiamate PUT/POST/DELETE che hanno la risposta che ad esempio "ricarica di ogni elemento delle impostazioni utente "sono necessari. Quindi devo prendere questa risposta e creare una mappa che mi dice che ad esempio i servizi REST A, C e F (roba relativa alle impostazioni dell'utente) deve colpire nuovamente il server la volta successiva in cui vengono eseguiti o se la cache scade dall'HTTP intestazioni.

Ciò è possibile con una libreria AngularJS o altri suggerimenti? Penso che sia simile a Observer o PubSub Pattern, non è vero?

Un'ultima cosa: È anche possibile avere qualcosa come PubSub senza utilizzare una cache/archiviazione locale (quindi anche senza i controlli della cache dell'intestazione HTTP)? Quindi non posso chiamare il servizio REST, perché poi colpirà il server, cosa che non voglio in alcune circostanze (risposta da una precedente chiamata REST che mi restituisce l'evento "ricarica di ogni elemento delle impostazioni utente").

+0

Si potrebbe fare con un modello pub/sub. Spegni un evento con la risposta che ritorna da un post/put/del request, e fai in modo che gli ascoltatori nei servizi li aspettino e poi GET request. – reptilicus

+0

Sì, ma forse non è necessario effettuare immediatamente la chiamata REST, perché l'elemento di pagina che deve essere ricaricato non è visibile/sulla stessa pagina Web. – Tim

+0

Il modo in cui lo facciamo è ascoltare un evento nel servizio, come userOptionsService, e quando viene inviato un POST, eseguire un ricaricamento in userOptionsService, quindi nel controller caricare i dati memorizzati in userOptionsService.userOptions – reptilicus

risposta

0

Puoi provare qualcosa di simile.

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

Questo è solo un semplice codice che ho scritto per implementare il tuo concetto. Non l'ho provato ed è tutto tuo.

Problemi correlati