2017-10-20 27 views
1

J'utilise Interceptors pour mettre en cache et retourner les données mises en cache dans le cadre de la fonctionnalité Angular 4.3 HttpClient. Vous trouverez ci-dessous le service utilitaire appelé par l'intercepteur pour stocker et renvoyer la réponse HTTP. Ci-dessous est mon intercepteur qui vérifie l'entrée en cache et renvoie si disponible.Conversion HttpResponse mis en cache comme observable dans HttpClient

@Injectable() 
export class CacheInterceptorService implements HttpInterceptor { 
    constructor(private localStorageCacheService: LocalStorageCacheService) { 
    } 
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     if (req.method !== 'GET') { 
      return next.handle(req); 
     } 
     const cachedResponse = this.localStorageCacheService.get(req); 
     if (cachedResponse) { 
     **return Observable.of(cachedResponse);** 
     } 
     return next.handle(req).do(event => { 
      if (event instanceof HttpResponse) { 
      this.localStorageCacheService.put(req, event); 
      } 
     }); 
     } 
} 

Le problème que j'ai est que, l'appel http ne touche pas la section d'abonnement du composant appelant. i.e instruction return Observable.of (cachedResponse); ne semble pas retourner correctement.

Des idées?

Mise à jour # 1

je me suis dit le problème, il a été apparemment coulée de objet-HttpResponse de type ne se produit pas pour une raison quelconque, donc de prouver ce point, quand je construisais l'objet manuellement en utilisant l'objet plaine, il a commencé à travailler. Mais évidemment, le lancer manuel est une chose sale et doit comprendre pourquoi le casting ne fonctionnait pas.

if (cachedResponse) { 

    let httpResponse = new HttpResponse({ 
    status : cachedResponse.status, 
    body : cachedResponse.body, 
    headers : cachedResponse.headers, 
    statusText : cachedResponse.statusText, 
    url : cachedResponse.url 
    }); 

    return Observable.of(httpResponse) 
}; 

Répondre

0

Essaye comme ceci:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    return <HttpRequest<any>>req.catch((error) => { 
     return <HttpHandler>next.catch((err) => { 
      if (req.method !== 'GET') { 
       return next.handle(req); 
      } 
      const cachedResponse = this.localStorageCacheService.get(req); 
      if (cachedResponse) { 
       return Observable.throw(cachedResponse); 
      } 
      return next.handle(req).do(event => { 
       if (event instanceof HttpResponse) { 
        this.localStorageCacheService.put(req, event); 
       } 
      }); 
     }) 
    }) 
} 
+0

je l'ai fait et je reçois l'erreur ci-dessous * Type 'HttpHandler' est incessible à taper 'Observable >'. La propriété '_isScalar' est manquante dans le type 'HttpHandler'. * – shanmohan