将RxJs Observable of Observable转换为有多少个Observable待定?

将RxJs Observable of Observable转换为有多少个Observable待定?,rxjs,rxjs6,Rxjs,Rxjs6,我正在创建一个具有多个方法触发HTTP调用的服务。我想向客户透露一个可观察的消息,告诉他们是否有任何未决呼叫 我认为这种方法通常是可行的,但感觉很粗糙,不太像RxJs。我已经搜索了StackOverflow和RxJs文档,但找不到更好的方法。有什么建议吗?谢谢 let pendingCountSubject = new BehaviorSubject<number>(0); let pendingCount$ = pendingCountSubject.asObservable();

我正在创建一个具有多个方法触发HTTP调用的服务。我想向客户透露一个可观察的消息,告诉他们是否有任何未决呼叫

我认为这种方法通常是可行的,但感觉很粗糙,不太像RxJs。我已经搜索了StackOverflow和RxJs文档,但找不到更好的方法。有什么建议吗?谢谢

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 }}