RxJs:在concapMap之后合并所有值,以便它们在“下一个”订阅事件中一起发出吗?

时间:2019-05-08 13:43:58

标签: angular rxjs observable

我已经建立了一个可观察对象,基本上可以为数组中的每个项目调用一个终结点,但是随后我需要将这些项目合并在一起,然后发布到订阅“ next”。现在,根据数组中的总数,将执行“下一个”订阅N次,有什么想法吗?这是我的代码

   from(items)
      .pipe(
        concatMap(item => {    
          return this.httpClient.get("https://randomuser.me/api/")
        }),
        tap(items => {
          debugger
        })
      )
      .subscribe(
        result => {
          debugger
        },
        error => {
          debugger
        }
      )

我尝试将mergeAll放置在TAP之前,但是它崩溃了。

有什么想法吗?

预先感谢

1 个答案:

答案 0 :(得分:1)

  • toArray()将积累一系列响应,
  • reduce()可用于以更灵活的方式重现toArray()的行为:您可以应用更复杂的合并逻辑(例如忽略重复的条目或whatsnot)。

P.S。不确定,但是可能是您设计错误的情况。与其在此处使用累积,不如希望可以观察到一个更高的顺序,以便您的使用者不需要显式地使用数组,并且底层逻辑更加分离。


好吧,事实是您可以认为toArray()是归约的特例。让我们从签名开始:reduce(accumulator: function, seed: any): Observable。因此,第二个参数seed是您从其开始的初始值(如果要减少的流为空,则seed是唯一的结果)。如果toArray() seed只是[]-一个...空的数组!然后,第一个参数accumulator是一个使用(result, current)-两个参数的函数,其中result代表到目前为止的结果,而current代表“尚未归约”流的元素。因此,result的类型为arraycurrent的类型可以是您的流的类型,在您的情况下-我猜是http响应。 (result, current) => { result.Add(current); return result; }-这是最简单的实现,它将为您提供toArray()的行为。但是,您可以做更多的事情,例如决定不添加current(如果过时或无效),这就是为什么我告诉您reduce()功能更强大的原因。

P.P.S。如果您想知道兔子的洞有多深,那么reduce(在Haskell和其他功能语言中也称为foldl)基本上就是递归模式。通过递归定义的大多数内容(但绝对不是全部!)可以用适当的reduceseed参数重写为accumulator;例如,通过缩减实现filter非常容易。 See this question to find out more