组合2个可观察物体,以便只有当第二个发射时才发出下一个值
问题描述:
我有一个Observable Obs1已使用从对象数组开始的方法from
创建。组合2个可观察物体,以便只有当第二个发射时才发出下一个值
我们假设数组有10个对象,这意味着Obs1会发射10次然后终止。
对于由发出的每个对象Obs1我想执行一个返回Observable的函数。因此,相同数量的数组的元素由函数返回的观测量,我们姑且称之为Obs2-1Obs2-2 ... Obs2-10。这些观测值只发出1个值,然后完成。
我想以某种OBS1链接到一系列的观测量Obs2-1的...... Obs2-10使OBS1发出其(N + 1)个值时OBS2 - n发出。
一个真实的例子可以使这件事更清楚。假设我有一个字符串数组。每个字符串都是文件的名称。我有一个功能r-w-files(files: Array<string>)
它读取列表中的每个文件并将其写入另一个目录中。
我想为大量文件执行此读写逻辑,因此为了避免同时打开太多文件,我想将较大的初始列表分成较小的块,然后将它们用SEQUENTIALLY进行处理功能r-w-files(files: Array<string>)
。
我所想象是有组块的缓冲器的特定形式,其
- 发射第一组块,并将其传递到
r-w-files(files: Array<string>)
- 它然后等待,直到可观察到由
r-w-files(files: Array<string>)
返回完成 - 一旦它完成它通过第二个块到
r-w-files(files: Array<string>)
- 等等
有什么方法可以用Observable运算符来实现这样的逻辑吗?
答
要切换顺序观测量,你可以使用concatMap:
Rx.Observable.from(['value 1', 'value 2', 'value 3'])
.concatMap(value => createNewObservable(value))
.subscribe()
concatMap等待,直到先前创建的可观测完成切换到下一个之前。
你见过[zip运营商](http://reactivex.io/documentation/operators/zip.html)吗? –
感谢您的答案 - 不幸的是我原来的问题不是很清楚,也没有解释我面临的全部问题 - 我已经编辑了更多细节问题(zip操作符会处理我原来的问题,但不是我真正的问题,无论如何感谢) – Picci
难道你只是需要['bufferCount'](https://github.com/ReactiveX/rxjs/blob/master/src/operators/bufferCount.ts)? –