是否有用于创建/处理HTTP流的RXJS标准?

时间:2019-03-20 19:24:51

标签: angular http rxjs observable rxjs-pipeable-operators

简而言之,我经常使用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之类的东西会类似地处理内部订阅,而高阶可观对象并不是反模式,但我不禁认为我做错了。

内部订阅真的是这样做的方法吗?有没有办法让使用者在不对服务器进行冗余调用的情况下等待HTTP请求?

有人可以阐明这件事吗?

1 个答案:

答案 0 :(得分: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不是适合该工作的工具,而我只是少数派:)