代码之家  ›  专栏  ›  技术社区  ›  Tom van Brienen

按顺序执行可观察项并发出一个结果

  •  11
  • Tom van Brienen  · 技术社区  · 7 年前

    我有一个可观察的数组,我正在并行执行它,使用:

    let observables: Observable<any>[]
    
    Observable.forkJoin(observables) 
    

    这非常有效,但是,我需要按顺序执行观察数组,并且如果最后一个观察已完成,则只发出一个结果。那时候我试着

    Observable.concat(observables)
    

    但这会返回多个结果,而不仅仅是使用forkJoin时得到的一个组合结果。所以我实际上需要两者的结合。

    我尝试使用reduce功能按顺序执行它们,如下所示:

    return observables.reduce((previous, current) => {
      return previous.flatMap(() => current);
    }, Observable.empty());
    

    但在这个解决方案中,根本不执行可观测值。

    3 回复  |  直到 7 年前
        1
  •  9
  •   riorudo    4 年前

    Jota.Toledo Mateusz Witkowski 在他们的回答中显示 RxJS的新语法 您可以执行以下操作:

    return concat(...observables).pipe(toArray());
    
        2
  •  8
  •   Jota.Toledo    4 年前

    假设您的 observables 发出 单数的 价值观 非阵列 ,您可以将当前的方法修改为:

    return Observable.concat(...observables).reduce((acc, current) => [...acc, current], []);
    

    甚至更短:

    return Observable.concat(...observables).toArray();
    

    如果它们发出 大堆 值,可以执行以下操作:

    const source = Observable.concat(...observables).flatMap(list => list).toArray();
    
        3
  •  5
  •   Mateusz Witkowski    7 年前

    您可以使用 toArray() 操作员:

    Observable.concat(observables).toArray().subscribe()
    

    正如RxJS文档中所述:它创建了“一个包含单个元素的可观察序列,以及一个包含源序列所有元素的列表”。