Ich muss das Ergebnis einer Anfrage beim ersten Anruf zwischenspeichern und dann den zwischengespeicherten Wert für nachfolgende Anrufe lesen.Wie können Funktionsaufrufe mit RXJS dynamisch verkettet werden?
Um dieses Ziel zu erreichen, verwende ich Versprechungen und ich verkette sie. Ich habe eine funktionierende Lösung, aber ich würde es gerne in RxJS Observables statt Promises konvertieren.
Hier ist meine Arbeitslösung:
private currentPromise: Promise<{ [key: string]: any }>;
private cache: any;
public getSomething(name: string): Promise<number>{
return this.currentPromise = !this.currentPromise ?
this._getSomething(name) :
new Promise((r) => this.currentPromise.then(() => this._getSomething(name).then((res) => r(res))));
}
private _getSomething(name: string): Promise<any> {
return new Promise((resolve) => {
if (this.cache[name]) {
this.messages.push("Resolved from cache");
resolve(this.cache[name]);
} else {
// Fake http call. I would use Angular's Http class.
setTimeout(()=> {this.messages.push("Resolved from server"); this.cache[name] = name; resolve(this.cache[name]); }, 2000);
}
});
}
this.getSomething("thing1").then((res)=>this.messages.push(res));
this.getSomething("thing1").then((res)=>this.messages.push(res));
this.getSomething("thing2").then((res)=>this.messages.push(res));
this.getSomething("thing2").then((res)=>this.messages.push(res));
this.getSomething("thing1").then((res)=>this.messages.push(res));
this.getSomething("thing2").then((res)=>this.messages.push(res));
this.getSomething("thing1").then((res)=>this.messages.push(res));
this.getSomething("thing2").then((res)=>this.messages.push(res));
Sie können es auf dieser plunkr testen: https://plnkr.co/edit/j1pm2GeQf6oZwRvbUsXJ?p=preview
Wie erreiche ich das Gleiche mit RxJS 5 Beta?
aktualisieren
Bergi Kommentare Nach ich meine plunkr und meinen Code aktualisiert es näher zu bringen meine realen Fall
„*' neue Promise ((r) => this.currentPromise.then (() => this._getSomething (params) .then ((res) => r (res)))); '*" - was? Was soll das tun (und: [tue es nicht] (http://stackoverflow.com/q/23803743/1048572))? Warum nicht einfach die 'currentPromise' zurückgeben? – Bergi
Wenn Sie bereits 'currentPromise' zwischenspeichern, müssen Sie den Wert nicht zusätzlich in' .cache' zwischenspeichern. Übertreibe es nicht. – Bergi
@Bergi Jedes Mal, wenn "getSomething" aufgerufen wird, füge ich ein neues ".then()" an das currentPromise an, so dass alle "getSomething" -Aufrufe in derselben Reihenfolge ausgeführt werden, in der sie aufgerufen werden. Der erste Aufruf ruft die Daten vom Server ab und speichert sie zwischen. Die nachfolgenden Aufrufe geben die Daten aus dem Cache zurück. –