2016-05-31 24 views
6

Spodziewam się, że moja sprawa jest powszechna, ale nie może znaleźć niczego odpowiedniego. Co chcę osiągnąć w Angular2/RxJS 5 to:Emituj następną wartość ze źródła Obserwowalne, gdy inny obserwowalny, powiadamiający, emituje

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

Tak, mam źródło obserwowalnych który emituje wartości i chcę, każdy z nich, aby dostać się do wyjścia tylko wtedy, gdy drugi Obserwowalne (nazwać zgłaszający). To tak, jakby jedno zdarzenie z powiadamiającego oznaczało "zezwól na przejście obok".

Próbowałem , ale moim głównym problemem jest to, że wszystkie wartości źródłowe czekają na to samo jedno zdarzenie z powiadamiającego, więc na przykład, jeśli 3 wartości źródłowe są "ustawione w kolejce", a powiadomienie zostanie wysłane raz, wszystkie 3 wartości przejść, co nie jest tym, czego chcę.

Odpowiedz

2

Odpowiedź jest 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)); 

przykład here roboczych.

Daje to wartość, gdy para jest wytwarzana z obu strumieni. Tak więc w przykładzie zostanie wydrukowana wartość z valueStream, gdy notificationStream tworzy wartość.

1

myślę, że operator zip jest to, czego szukasz:

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

Zobacz ten plunkr: https://plnkr.co/edit/MK30JR2qK8aJIGwNqMZ5?p=preview.

Zobacz też to pytanie: