0

简而言之,我在使用 RXJS 时经常遇到障碍,因为几乎每个示例都依赖于恒定的数据流,而我发出的 HTTP 请求本质上是单一的。

我的常见场景是这样的:我有一个服务可以进行 API 调用并更新必要的消费者。在我看来,这就像简单的事件发射。订阅者连接并等待事件 - 一旦他们得到它,他们就会离开并单独做自己的事情。

我相信您知道,问题在于 HTTP 订阅在完成后立即终止,并且“连接”会立即触发它。这是我仍然难以理解的 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 请求而不对服务器进行冗余调用?

任何人都可以对这个问题有所了解吗?

4

1 回答 1

0

我违反了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().

这是一种与流行模式相反的替代方法,并且没有具体回答所述问题。

这就是我如何解决我也遇到的“感觉……错误”的错觉。我不认为 rxjs 是适合这项工作的工具,而且我是少数 :)

于 2019-03-20T19:58:28.420 回答