将RxJs Observable of Observable转换为有多少个Observable待定?
我正在创建一个具有多个方法触发HTTP调用的服务。我想向客户透露一个可观察的消息,告诉他们是否有任何未决呼叫 我认为这种方法通常是可行的,但感觉很粗糙,不太像RxJs。我已经搜索了StackOverflow和RxJs文档,但找不到更好的方法。有什么建议吗?谢谢将RxJs Observable of Observable转换为有多少个Observable待定?,rxjs,rxjs6,Rxjs,Rxjs6,我正在创建一个具有多个方法触发HTTP调用的服务。我想向客户透露一个可观察的消息,告诉他们是否有任何未决呼叫 我认为这种方法通常是可行的,但感觉很粗糙,不太像RxJs。我已经搜索了StackOverflow和RxJs文档,但找不到更好的方法。有什么建议吗?谢谢 let pendingCountSubject = new BehaviorSubject<number>(0); let pendingCount$ = pendingCountSubject.asObservable();
let pendingCountSubject = new BehaviorSubject<number>(0);
let pendingCount$ = pendingCountSubject.asObservable();
let pendingSubject = new Subject<Observable<any>>();
pendingSubject.pipe(
finalize(() => {
pendingCountSubject.next(pendingCountSubject.value - 1);
}))
.subscribe();
function trackPendingObservable(obs) {
pendingCountSubject.next(pendingCountSubject.value + 1);
pendingSubject.next(obs);
}
trackPendingObservable(httpCall1);
trackPendingObservable(httpCall2);
trackPendingObservable(httpCall3);
如果我没弄错的话,您的服务有几种执行http调用的方法,例如
httpCall1(): Observable<any> { // do stuff}
httpCall2(): Observable<any> { // do stuff}
httpCallN(): Observable<any> { // do stuff}
其中,我假设组件中
MyHttpService
的名称是httpService
httpService.pendingCount来自哪里?我看不出和你们班上的代码有什么关系。我错过了什么?你是对的。有个打字错误。没有“pendingCount”而是“callsOnFly”。我更正了代码。是的,这是一般结构!对不起,我没说清楚。我想我正在寻找一种奇特的方法,将所有的调用下一步()到一个主题,这个主题可以通过一些奇特的操作来生成所有这些,而不需要手动计数。在http调用返回后不使用tap only触发器吗?因此在请求挂起时不会实际显示?(我还认为错误意味着根本不调用时间点击)@Rabbit您是对的,用于递增计数器的点击
操作符就是错误的,原因正如您所提到的。在调用httpClient
之前,需要增加计数器。我不确定我是否理解你关于有一个做某事的主题的观点。当然,只需在一种方法中隔离增量/减量,就可以避免重复增量/减量。我已相应地更新了我的答案。
httpCall1(): Observable<any> { // do stuff}
httpCall2(): Observable<any> { // do stuff}
httpCallN(): Observable<any> { // do stuff}
export class MyHttpService {
constructor(private http: HttpClient)
public callsOnFly = 0;
httpGenericCall(httpCall: Observable<any>) {
this.callsOnFly++;
return httpCall
.pipe(
finalize(() => this.callsOnFly--)
)
}
httpCall1() {
return this.httpGenericCall(this.http.get('http://my-server1'));
}
httpCall12() {
return this.httpGenericCall(this.http.get('http://my-server2'));
}
httpCallN() {
return this.httpGenericCall(this.http.get('http://my-serverN'));
}
}
Pending calls: {{ httpService.callsOnFly }}