【问题标题】:Combining 2 Observables so that one emits the next value only when the second emits组合 2 个 Observable,以便一个仅在第二个发出时发出下一个值
【发布时间】:2018-05-16 14:08:02
【问题描述】:

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

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

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

我想以某种方式将 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&lt;string&gt;) 完成
  • 一旦完成,它会将第二个块传递给r-w-files(files: Array<string>)
  • 等等

有没有办法用 Observable 操作符来实现这样的逻辑?

【问题讨论】:

  • 你见过zip operator吗?
  • 感谢您的回答 - 不幸的是,我最初的问题并不是很清楚,也没有解释我面临的全部问题 - 我已经用更多细节编辑了这个问题(zip 运算符会与我原来的问题,但不是我真正的问题,无论如何谢谢)
  • 你不需要bufferCount吗?

标签: rxjs observable reactive-programming reactive


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答 - 不幸的是,我最初的问题并不是很清楚,也没有解释我面临的全部问题 - 我已经用更多细节编辑了这个问题(zip 运算符会与我原来的问题,但不是我真正的问题,无论如何谢谢)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多