简单地说,我经常遇到RXJS的障碍,因为几乎每个示例都依赖于恒定的数据流,而我发出的HTTP请求本质上是单一的。
我的常见场景是:我有一个服务,它进行API调用并更新必要的使用者。在我的脑海中,它就像是简单的事件发射。订阅者连接并等待事件-一旦他们得到它,他们就离开并分别做他们自己的事情。
问题是,我相信您知道,HTTP订阅在完成后立即终止,“连接”会立即触发它。这是一个我仍然难以理解的RXJS概念。
因此,当你加入对方法的并发调用时,消费者依赖于其他消费者,forkjoin和异步地狱-我尝试了涉及主题,回放,共享地图的各种令人厌恶的东西。我最终决定这样做:
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$;
}
It feels...wrong。我知道像mergeMap这样的东西处理内部订阅的方式是类似的,更高阶的观察量也不是反模式的,但我不禁认为我只是做错了。
内部订阅真的是做到这一点的方法吗?有没有办法让消费者在不对服务器进行多余调用的情况下等待HTTP请求?
有没有人能说明一下这件事?
发布于 2019-03-21 03:58:28
我违反了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();
]);
}
上面不包括错误处理或嵌套..也许request blahB
会返回你需要获取的键。向toPromise()
追加一条then()
语句。
这是一种与流行模式相反的替代方案,并且没有具体回答指定的问题。
这也是我解决"It feels...wrong“delima的方法。我不认为rxjs是适合这项工作的工具,我是少数:)
https://stackoverflow.com/questions/55268729
复制相似问题