简单地说,我经常使用RXJS遇到障碍,因为几乎每个例子都依赖于一个恒定的数据流,而我正在制作本质上是单数的HTTP请求。
我的常见情况是这样的:我有一个服务,可以进行API调用并更新必要的消费者。在我的脑海中,这就像简单的事件发射。订阅者连接并等待事件 - 一旦他们得到它,他们就会分开做自己的事情。
正如我相信你知道的那样,问题是HTTP订阅在完成后立即终止,并且“connect”会立即触发它。这是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这样的东西类似地处理内部订阅而更高阶的observables不是反模式的,但我不禁想到我只是做错了。
内部订阅真的是这样做的吗?有没有办法让消费者在不对服务器进行冗余调用的情况下等待HTTP请求?
任何人都能对此事有所了解吗?
我反对使用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()
声明。
这是一种与流行模式相反的替代方案,并没有具体回答所陈述的问题。
这就是我解决了“感觉......错误”delima的原因。我不认为rxjs是适合这项工作的工具,我是少数人:)