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

问题描述 投票:0回答:1

简单地说,我经常使用RXJS遇到障碍,因为几乎每个例子都依赖于一个恒定的数据流,而我正在制作本质上是单数的HTTP请求。

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

正如我相信你知道的那样,问题是HTTP订阅在完成后立即终止,并且“connect”会立即触发它。这是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请求?

任何人都能对此事有所了解吗?

angular http rxjs observable rxjs-pipeable-operators
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()声明。

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

这就是我解决了“感觉......错误”delima的原因。我不认为rxjs是适合这项工作的工具,我是少数人:)

© www.soinside.com 2019 - 2024. All rights reserved.