2016-05-31 18 views
6

Mi aspetterei che il mio caso sia comune ma non riesco a trovare nulla di appropriato. Quello che voglio raggiungere, in Angular2/RxJS 5 è questo:Emetti il ​​prossimo valore dalla sorgente Osservabile quando un altro osservabile, il notificatore, emette

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

Quindi, ho una fonte osservabile che emette valori, e voglio che ognuno di loro di entrare in uscita solo quando una seconda osservabile (chiamarlo notificante) emette. È come se un evento dal notificatore significasse "consentire al prossimo passaggio".

Ho provato delayWhen, ma il mio problema principale con questo è che tutti i valori di origine sono in attesa dello stesso evento dal notificante, quindi ad esempio se 3 valori di origine sono "accodati" e il notificatore emette una volta, tutti e 3 i valori passare attraverso, che non è quello che voglio.

risposta

2

La risposta è 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)); 

esempio here lavoro.

Questo produce un valore quando una coppia viene prodotta da entrambi i flussi. Quindi l'esempio stamperà un valore da valueStream quando notificationStream produce un valore.

1

Penso che l'operatore zip è quello che stai cercando:

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(); 
} 

Vai a questa plunkr: https://plnkr.co/edit/MK30JR2qK8aJIGwNqMZ5?p=preview.

Vedi anche questa domanda:

Problemi correlati