2017-05-27 2 views
0

Ich versuche, die Anzahl der unnötigen HTTP-Anrufe in meiner Anwendung zu begrenzen, aber jedes Mal, wenn ich ein Observable abonniere, wird eine Anfrage an den Server gestellt. Gibt es eine Möglichkeit, eine Observable zu abonnieren, ohne eine HTTP-Anforderung auszulösen? Mein beobachtbaren Service sieht wie folgt aus:Angular4 Rxjs Observable Beschränken Backend HTTP-Anfragen

getServices(): Observable<Service[]> { 
    return this.http.get(this.serviceUrl).map(res => res.json())._catch(err => err); 
} 

Dann in meiner Komponente abonniere ich, dass beobachtbare wie folgt aus:

this.serviceService.getServices().subscribe(services => this.services = services);

Was ich möchte, ist erreichen, um Daten zu speichern irgendwie auf den Dienst selbst (damit ich diese Daten in der gesamten Anwendung verwenden kann, ohne Anforderungen für jede Komponente separat zu stellen, aber ich würde auch gerne wissen, wann diese Daten von Komponenten empfangen werden (was ich normalerweise per Abonnement mache).

+0

... Nur die Funktion nicht aufrufen, die die Anfrage auslöst? <. Chrillewoodz

+0

Ich abonniere es, weil ich die gleichen Daten haben möchte, die es zur Verfügung stellt ... für jetzt habe ich einen Workaround erstellt und "this.services" in ein Thema eingefügt und ein Observable aus dem sbuject erstellt. –

+0

Dies ist bereits hier beschrieben: https://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201705280824475411303 – martin

Antwort

0

Nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber anscheinend möchten Sie die Ergebnisse der ersten HTTP-Anfrage im Service zwischenspeichern. Wenn also die erste Komponente die Daten holt, würde die zweite die anderen Daten abrufen . Wenn dies der Fall ist, deklarieren Sie einen Dienstanbieter auf Modulebene, sodass Angular ein Singleton-Objekt erstellt. Erstellen Sie dann im Service eine Variable, die die Daten nach dem ersten Abruf speichert.

@Injectable() 
export class DataService{ 

    mydata: Array<string>[]; 

    constructor(private http:Http){} 

    getServices(): Observable<string[]> { 
     if (this.mydata){ 
      return Observable.from(this.mydata); // return from cache 
     } else 
     { 
      return return this.http.get(this.serviceUrl).map(res => res.json())._catch(err => err); 
     } 
    } 
} 
Verwandte Themen