2016-07-14 16 views
2

Ich habe einen LanguageService, der eine Liste der verfügbaren Sprachen bietet. Diese Liste muss von einem Backend-Anforderung initialisiert:eckig 2 - Cache http Ergebnis erhalten

getAvailableLanguages(): Observable<Language[]> { 
    ... 
    return this.http.get(ApiResources.LANGUAGE, requestOptions) 
      .map(response => this.extractJson(response)) 
      .catch(error => this.handleError(error)); 
} 

Ich würde das Backend jedes Mal ein anderer Dienst languageService.getAvailableLangauges() Anrufe vermeiden möchten anfordert.

Was wäre eine gute Möglichkeit, das Ergebnis der notwendigen ersten Anfrage zwischenzuspeichern?

Antwort

3

Sie können es wie folgt Cache:

import { Observable } from 'rxjs/Observable' 
import 'rxjs/add/observable/of' 

// ... 

getAvailableLanguages(): Observable<Language[]> { 
    return this._data ? Observable.of(this._data) : this.http.get(ApiResources.LANGUAGE, requestOptions) 
      .map(response => this.extractJson(response)) 
      .catch(error => this.handleError(error)) 
} 

Wo this._data wird die zwischengespeicherte Antwort, die durch extractJson eingestellt werden kann:

extractJson(res) { 
    let json = res.json() 
    // something, set this._data ... 
    return this._data 
} 
+0

so einfach ... Danke! – Philipp

+1

aber dies wird nicht zwischengespeichert, wenn Sie eine Seite aktualisieren –

+1

@FrancisManojFernnado Die Frage war nicht darüber. Aber wenn Sie es brauchen, dann ist der einfache Ansatz, sessionStorage zu verwenden. In diesem Fall würde ich den http-Teil in einen separaten Dienst abstrahieren, der zuerst den Speicher prüft und den zwischengespeicherten "_data" im Dienst initialisiert. Oder eine Anfrage stellen, wenn der Cache nicht verfügbar ist. – dfsq