2016-03-14 215 views
0

假設我有一個可觀察值,它生成09之間的元素。我想有一個新的觀察點,只有在7之後纔會發出3。我相信它應該是這個樣子:RxJS:延遲可觀察項的生成

// INPUT: 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 
// OUTPUT: 0 - 1 - 2 ----- 4 - 5 - 6 - 7 - 3 - 8 - 9 

let source = Rx.Observable.range(0, 10).XXX([ 
    item => item === 3, 
    item => item === 7 
]); 

是否RxJS包含這樣XXX方法?

回答

2

我不知道存在的方法,但是,我們可以嘗試解決問題。讓我們把我們的潛在觀察者分成兩個流;一個滿足我們的謂語(即x => x === 3)和一個當值不符合該謂詞:

const item$ = Rx.Observable.range(0, 10); 
const predicate = x => x === 3; 

// Split our underlying stream into two Observables; one where each value 
// will equal three, and the other where each value is not three. 
const [ three$, notThree$ ] = item$.partition(predicate); 

我們可以每當7號發生時將發出流:

const seven$ = notThree$.filter(x => x === 7); 

現在,讓我們兩個流來代表我們的基礎數據之前發出7和後

const beforeSeven$ = notThree$.takeUntil(seven$); 
const afterSeven$ = notThree$.skipUntil(seven$); 

最後,我們可以預期的效果組合這些流。我們基本上CONCAT的afterSeven $和三個$儘快流作爲我們beforeSeven $流結束:

const result$ = beforeSeven$.concat(three$.merge(afterSeven$); 

這裏有一個的jsfiddle是console.log S中的結果:https://jsfiddle.net/cbelden/ppjmxww1/

+0

我想過這樣的事情!感謝您發佈這個答案。 – franza