2016-05-31 1 views
6

Я ожидал бы, что мой случай распространен, но не может найти что-либо подходящее. То, что я хочу достичь в Angular2/RxJS 5 это:Извлечь следующее значение из источника. Наблюдается, когда другой Наблюдаемый, уведомитель, испускает

source: ---1--2--3--4---------5--------6-|--> 
notifier: -o------------o-----o---o--o-o------> 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
output: ---1----------2-----3---4--5---6-|--> 

Итак, у меня есть источник Observable, испускающий значения, и я хочу, чтобы каждый из них, чтобы попасть в выходе только тогда, когда второй Наблюдаемые (назовем его уведомитель). Это похоже на одно событие из уведомителя означает «разрешить прохождение через».

Я пробовал delayWhen, но моя основная проблема заключается в том, что все исходные значения ожидают одно и то же событие от уведомителя, так, например, если три значения источника «поставлены в очередь» и уведомитель выдает один раз, все 3 значения пройти, что не то, что я хочу.

ответ

2

Ответ на zip:

const valueStream = 
    Rx.Observable.from([0, 1, 2, 3, 4, 5, 6]); 

const notificationStream = 
    Rx.Observable.interval(1000).take(7); 


Rx.Observable 
    .zip(valueStream, notificationStream, (val, notification) => val) 
    .subscribe(val => console.log(val)); 

Рабочий пример here.

Это дает значение, когда пара создается из обоих потоков. Таким образом, пример напечатает значение от valueStream, когда notificationStream выдает значение.

1

Я думаю, что оператор zip является то, что вы ищете:

sourceSubject:Subject = new Subject(); 
notifierSubject:Subject = new Subject(); 

index = 1; 

constructor() { 
    Observable.zip(
    this.sourceSubject, this.notifierSubject 
) 
    .map(data => data[0]) 
    .subscribe(data => { 
    console.log('>> output = '+data.id); 
    }); 
} 

emit() { 
    this.sourceSubject.next({id: this.index}); 
    this.index++; 
} 

notify() { 
    this.notifierSubject.next(); 
} 

Смотрите эту plunkr: https://plnkr.co/edit/MK30JR2qK8aJIGwNqMZ5?p=preview.

Смотрите также вопрос: