javascript - Angular2 la manera más fácil de almacenar en caché las respuestas HTTP
Tengo una página que realiza solicitudes http al mismo lugar, solo con diferentes parámetros dependiendo de lo que el usuario quiera. Así que mi código se ve algo así:
this.http.post( //I am open to POST methods or GET methods as I have security in the back to prevent malicious writes.
'http://192.168.1.45:3000/mylocation',
'p1=' + param1 + '&p2=' + param2,
{headers: headers}
)
En JQuery, por ejemplo, tienes incorporado en el framework un atributo de caché que almacena en caché automáticamente y es muy fácil de implementar:
$.ajax({
cache: true,
//other options...
});
¿Tiene Angular2 algo similar a esto? Me gustaría almacenar en caché estas respuestas dinámicas mientras el usuario esté en la aplicación. Entonces, si un usuario solicita la misma URL con los mismos parámetros, simplemente lo tomaría de la caché, y si los parámetros nunca se han usado todavía, entonces haría la llamada a la red.
No pude encontrar nada en la documentación de Angular2 sobre las opciones de solicitud:
https://angular.io/docs/js/latest/api/http/RequestOptions-class.html
Respuesta #1
Almacena los datos en caché, y si hay datos en caché disponibles, devuélvelos; de lo contrario, realiza la solicitud HTTP. Si deseas reutilizar para diferentes solicitudes (parámetros), puedes ajustarlo para almacenar las referencias en un array en su lugar.
getData() {
if(this.data) {
// if `data` is available just return it as `Observable`
return Observable.of(this.data);
else if(this.observable) {
// if `this.observable` is set then the request is in progress
// return the `Observable` for the ongoing request
return this.observable;
} else {
// create the request, store the `Observable` for subsequent subscribers
this.observable = this.http.get('/someUrl')
.map(res => res.json())
.do(val => {
this.data = val;
// when the cached data is available we don't need the `Observable` reference anymore
this.observable = null;
})
// make it shared so more than one subscriber can get the result
.share();
return this.observable;
}
}
