组合2个Observable,以便只有在第二个发出时才会发出下一个值

时间:2017-12-02 17:57:17

标签: rxjs observable reactive-programming reactive

我有一个Observable Obs1 ,它是使用方法from从对象数组开始创建的。

假设Array有10个对象,这意味着 Obs1 会发出10次然后终止。

对于 Obs1 发出的每个对象,我想执行一个返回Observable的函数。因此,函数返回的Observable与Array的元素数量相同,我们称之为 Obs2-1 Obs2-2 ... Obs2- 10 即可。这样的Observable只发出一个值,然后完成。

我想以某种方式将 Obs1 链接到一系列Observables Obs2-1 ... Obs2-10 ,以便 Obs1 Obs2- n 发出时,会发出(n + 1)值

一个真实的例子可以使这个事情更清楚。我们假设我有一个字符串数组。每个字符串都是文件的名称。我有一个函数r-w-files(files: Array<string>),它读取列表中的每个文件并将其写入另一个目录。

我想为大量文件执行此读写逻辑,因此,为了避免同时打开太多文件,我想将较大的初始列表分成较小的块,然后按顺序处理它们。函数r-w-files(files: Array<string>)

我想象的是拥有某种形式的块缓冲区

  • 发出第一个块并将其传递给r-w-files(files: Array<string>)
  • 然后等待直到Observable返回 r-w-files(files: Array<string>)完成
  • 一旦完成,它将第二个块传递给r-w-files(files: Array<string>)

有没有办法用Observable运算符实现这样的逻辑?

1 个答案:

答案 0 :(得分:2)

要按顺序切换Observable,可以使用 concatMap

Rx.Observable.from(['value 1', 'value 2', 'value 3'])
  .concatMap(value => createNewObservable(value))
  .subscribe()

concatMap 等到之前创建的Observable完成后才切换到下一个。