【问题标题】:Is there an RXJS standard for creating/handling HTTP streams?是否有用于创建/处理 HTTP 流的 RXJS 标准?
【发布时间】:2019-03-20 19:24:50
【问题描述】:

简单地说,我在使用 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 请求而不对服务器进行冗余调用?

谁能解释一下这个问题?

【问题讨论】:

  • 我不认为你所做的有任何根本性的错误。我唯一要做的就是将 BehaviorSubject 替换为简单的 Subject 或 ReplaySubject。后者是为了在 http 调用完成后为订阅 Obsvable 的消费者缓存调用结果。

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


【解决方案1】:

我违反了 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 是适合这项工作的工具,而且我是少数:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2017-06-29
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多