简而言之,我经常使用RXJS遇到障碍,因为几乎每个示例都依赖于恒定的数据流,而我发出的本质上是单数的HTTP请求。
我的常见情况是这样的:我有一个服务可以进行API调用并更新必要的使用者。在我的脑海中,这就像简单的事件发出。订户连接并等待事件-一旦获得事件,他们便离开并单独做自己的事情。
正如我确定您所知道的那样,问题在于HTTP订阅在完成后立即终止,而“连接”会立即触发它。这是RXJS的概念,我仍然难以解决。
因此,当您同时调用该方法时,使用者依赖于其他使用者,forkjoins和异步地狱-我尝试了涉及主题,重播和共享地图的各种可憎性。我最终选择了类似的东西:
myBehaviorSubject = new BehaviorSubject<Result>(null);
myBehaviorSubject$ = myBehaviorSubject.asObservable()
...
getData(params): Observable<Result[]> {
const http$ = this.httpClient
.get('blah', {params})
.pipe(map(response => response as Result[]));
http$.subscribe(result: Result => {
myBehaviorSubject.next(result);
});
return myBehaviorSubject$;
}
感觉... 错误。我知道诸如mergeMap之类的东西会类似地处理内部订阅,而高阶可观对象并不是反模式,但我不禁认为我做错了。
内部订阅真的是这样做的方法吗?有没有办法让使用者在不对服务器进行冗余调用的情况下等待HTTP请求?
有人可以阐明这件事吗?
答案 0 :(得分:0)
我违反了http请求的规范。他们不是流向我。
async getData(params): Promise<Result[]> {
return this.httpClient
.get('blah', {params})
.toPromise();
}
或者:
async loadComplexViewModelData(params): Promise<{[dataA, dataB, dataC]}> {
[dataA, dataB, dataC] = await Promise.all([
this.httpClient
.get('blahA', {params})
.toPromise();
this.httpClient
.get('blahB', {params})
.toPromise();
this.httpClient
.get('blahC', {params})
.toPromise();
]);
}
以上不包括错误处理或嵌套。.也许请求blahB
返回您随后需要提取的键。将then()
语句附加到toPromise()
。
这是一种与流行模式相反的替代方法,没有明确回答所陈述的问题。
这就是我解决我同样遇到的“感觉……错误”的法则的方法。我认为rxjs不是适合该工作的工具,而我只是少数派:)