2016-03-14 3 views
0

Предположим, что у меня есть наблюдаемое, которое генерирует элементы от 0 до 9. Я хотел бы иметь новый наблюдаемый, который будет излучать 3 только после 7. Я считаю, что это должно выглядеть примерно так: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

Смежные вопросы