RxJS - 按分区分割并使用iterval发射
问题描述:
如何使用RxJS实现类似以下内容的操作?RxJS - 按分区分割并使用iterval发射
ABCDEFGH
AB CD --- --- --- EF GH
或
ABCDEFGH
ABC ---- ----高清GH
我有一个数组,我需要按指定的分区分割并以指定的时间间隔发射值。
答
注意你不能从 'AB-' ab--',因为你必须等待 'B',所以严格的大理石图将
a-b-c-d-e-f-g-h-|
-(ab)---(cd)---(ef)---(gh|)
or
a-b-c-d-e-f-g-h-|
--(abc)----(def)----(gh|)
console.clear()
const Observable = Rx.Observable
const timedEmitter = (observable, interval) =>
Observable.zip(observable, Observable.timer(0, interval))
.map(x => x[0])
const source = Observable.from(['a','b','c','d','e','f','g','h'])
const timedSource = timedEmitter(source, 1000)
const interval = 5000
const size = 3
const output = timedEmitter(timedSource.bufferCount(size), interval)
//Display
const start = new Date()
output.timestamp()
.map(x => { return {value: x.value, elapsed: x.timestamp - start} })
.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
脚注,在timedEmitter中将Observable.interval(interval)
更改为Observable.timer(0, interval)
以首先发射。
脚注#2,这是不完全正确的,因为源的complete()
缩短了最后的时间间隔。
这只是所选间隔的人工产物。
下面是使用pipe()
从RxJs 5.5运营商定制版本,裁判Build your own operators easily
console.clear()
const Observable = Rx.Observable
const timedEmitter = (observable, interval) =>
Observable.zip(observable, Observable.timer(0, interval))
.map(x => x[0])
const source = Observable.from(['a','b','c','d','e','f','g','h'])
const timedSource = timedEmitter(source, 1000)
// Custom operator
const timedBufferedEmitter = (interval, bufferSize) => (observable) =>
Observable.zip(observable.bufferCount(bufferSize), Observable.timer(0, interval))
.map(x => x[0])
const interval = 5000
const size = 3
const output = timedSource.pipe(timedBufferedEmitter(interval, size))
//Display
const start = new Date()
output.timestamp()
.map(x => { return {value: x.value, elapsed: x.timestamp - start} })
.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
+0
谢谢,这正是我需要的! –
是这个分区的大小依据?可以说,你想要一个列表被分成3个组? –
是的,他们是按尺寸分开的。我可能需要2,3,4等(可配置值) –