如何将多个可观测值的发射值合并为一个可观测发射?

时间:2020-06-26 08:40:21

标签: angular typescript rxjs

我有一个函数,该函数接收DTO对象并将其转换为发出单个已转换Entity的可观察对象。它具有以下标头:

dtoTransformer(dto: DTO): Observable<Entity>

我还有一个返回Observable的函数,该函数发出DTO列表:

getDTOs(): Observable<DTO[]>

使用这两个,我需要编写一个函数,该函数返回从接收到的DTO转换而来的Entity列表的可观察值:

getEntyties():Observable<Entity[]>

我的问题是将dtoTransformer应用于可观察对象内DTO列表的值。有可以帮助我的接线员吗?我不知道该怎么办。

1 个答案:

答案 0 :(得分:0)

您可以结合使用forkJoinconcatMap。假设这些是简单的httpClient(正在完成)调用:

getEntities(): Observable<Entity[]> {
  return this.getDtos().pipe(
    concatMap((dtos) => forkJoin(
      dtos.map((dto) => this.dtoTransformer(dto))
    )
  )
}

这里发生了什么

  1. 致电http以获取DTO[]
  2. 将此响应映射到使用map
  3. 的http调用数组
  4. 将此可观察变量数组传递给forkJoin,它将进行并行调用并在所有条件都完成(且没有错误)时返回

很显然,您需要考虑一些事情,当一个http调用错误时,它不会返回任何内容,因此您需要添加一些后备。如果DTO[]数组很大,您可以达到请求限制,那么也许可以进行一些限制,或者通过并行生成固定数量进行分块,并在完成这些操作后继续下一个批次