2017-11-11 109 views
0

如何使用RxJS實現類似以下內容的操作?RxJS - 按分區分割並使用iterval發射

ABCDEFGH

AB CD --- --- --- EF GH

ABCDEFGH

ABC ---- ----高清GH

我有一個數組,我需要按指定的分區分割並以指定的時間間隔發射值。

+0

是這個分區的大小依據?可以說,你想要一個列表被分成3個組? –

+0

是的,他們是按尺寸分開的。我可能需要2,3,4等(可配置值) –

回答

4

注意你不能從 '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

謝謝,這正是我需要的! –