[英]RxJs: Share an Observable using async / await
使用RxJs 5和Angular 4。
我想共享一个可观察对象,这样我就只发出1个Http请求,并且我还想等待调用,以便在请求时得到结果。 我有以下代码:
export class DataService {
constructor(public http: HttpClient) {
this.getObservable();
}
public observable;
public getObservable() {
const url = "api/getData";
this.observable = this.http.get(`${this.baseUrl}${url}`).share()
}
public async hasData(data: DataEnum) {
const result = await this.observable.toPromise();
return result.filter(x => x === data).length > 0;
}
}
但是,对hasData的多次调用导致对我们的api端点的多次调用。 我假设我已将observable
设置为一个共享的observable,并且当我调用.toPromise()
,它将仅获取缓存的值并将其作为一个保证,我可以await
。
这是应该如何工作的?
您的代码对我来说似乎过于复杂。 我可能会做类似的事情:
private data = null;
getData():Observable<> {
// if data is already available, return it immediately
if (this.data) return Observable.of(this.data);
// else, fetch from the server and cache result
return this.http.get(url).do(data => this.data=data)
}
因此,只要您想要数据,就可以执行以下操作:
this.getData().subscribe(
data => console.log(data);
)
为了确保您不会在数据到达之前多次调用API端点,您有几种选择。
由于share
工作方式, observable
被重新订阅到toPromise
,从而产生新的请求。
承诺已经提供了缓存行为。 考虑到服务API中已经使用了Promise,可以将它们专用:
constructor(public http: HttpClient) {
this.getPromise();
}
public promise;
public getPromise() {
const url = "api/getData";
this.promise = this.http.get(`${this.baseUrl}${url}`).toPromise()
}
public async hasData(data: DataEnum) {
const result = await this.promise;
return result.filter(x => x === data).length > 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.