【问题标题】:Transform RxJs Observable of Observables into count of how many Observables are pending?将 Observable 的 RxJs Observable 转换为待处理的 Observable 的计数?
【发布时间】:2018-07-22 15:13:17
【问题描述】:

我正在制作一项服务,该服务具有多种触发 HTTP 调用的方法。我想向客户显示一个 Observable,告诉他们是否有任何待处理的调用。

我认为这种方法通常会奏效,但感觉很老套,不太像 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);

在模板中:

Pending calls: {{ pendingCount$ | async }}

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

    如果我没记错的话,你的服务有几种方法可以执行 http 调用,例如

    httpCall1(): Observable<any> { // do stuff}
    httpCall2(): Observable<any> { // do stuff}
    
    httpCallN(): Observable<any> { // do stuff}
    

    这些方法以某种方式并行运行,可能是因为它们以快速同步顺序调用。

    您想要显示的是在某个时刻它们中有多少处于“飞行状态”。

    这样的事情可能会奏效。

    该服务公开了 http 调用方法以及当前“正在运行”的调用的计数器。

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

    我假设组件中MyHttpService 的名称是httpService

    【讨论】:

    • httpService.pendingCount 是从哪里来的?我认为与您班级中的代码没有任何关系。我错过了什么?
    • 你是对的。有一个错字。没有“pendingCount”,而是“callsOnFly”。我更正了代码。
    • 是的,这就是一般结构!对不起,我没有更清楚。我想我正在寻找一种奇特的方式来将所有调用 next() 到一个主题中,该主题可以通过一些奇特的操作来生成所有这些,而无需手动计算。在http调用返回后不会只使用tap触发吗?因此在请求未决时实际上没有显示? (另外我认为错误意味着根本没有调用时间点击)
    • @Rabbit 你是对的,tap 增加计数器的操作符是错误的,因为你提到的原因。在调用httpClient 之前,计数器需要增加。我不确定我是否理解您关于拥有一个可以做某事的主题的观点。当然,您可以通过一种方法将其隔离,从而避免重复增加/减少。我已经相应地更新了我的答案。
    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-10-27
    • 2017-07-30
    • 2020-12-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多