我需要在第一次调用时缓存请求的结果,然后为后续调用读取缓存值。
为了实现这个目标,我正在使用 Promise 并将它们链接起来。我有一个可行的解决方案,但我想将其转换为 RxJS 的 observables 而不是 Promises。
这是我的工作解决方案:
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 beta 实现相同的目标?
更新
根据 Bergi 的评论,我更新了我的 plunkr 和我的代码,使其更接近我的真实案例