最初の呼び出しで要求の結果をキャッシュし、その後の呼び出しのためにキャッシュされた値を読み取る必要があります。
その目標を達成するために、私は約束を使用しており、それらを連鎖しています。私は実用的なソリューションを持っていますが、Promises ではなく RxJS のオブザーバブルに変換したいと考えています。
これが私の実用的なソリューションです:
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));
この plunkr でテストできます: https://plnkr.co/edit/j1pm2GeQf6oZwRvbUsXJ?p=preview
RxJS 5 ベータ版で同じことを達成するにはどうすればよいですか?
アップデート
Bergi のコメントに従って、実際のケースに近づけるために plunkr とコードを更新しました。