2015-02-04 18 views
6

Dire che ho due osservabili e una che voglio ascoltare sui cambiamenti in un osservabile, se l'altro su corrisponde a una determinata condizione. L'ho provato con zip ma sembra che mi verrà solo notificato, se cambiano entrambi gli osservabili, ma voglio essere avvisato per ogni cambiamento su uno osservabile, se la condizione dell'altro è vera.RxJS: Come posso fare un "se" con Observables?

Quello che ho cercato:

var firstState = new Rx.BehaviorSubject(undefined); 
var secondState = new Rx.BehaviorSubject(undefined); 

Rx.Observable.zip(firstState, secondState, function (first, second) { 
    return { 
    first: first, 
    second: second 
    } 
}).filter(function (value) { 
    return value.first !== undefined; 
}).subscribe(function (value) { 
    // do something with value.second 
}); 

ho notato che è un Rx.Observable.if, ma non riuscivo preso a lavorare.

risposta

7

Uso pausable:

secondState 
    .pausable(firstState.map(function (s) { return s !== undefined; })) 
    .subscribe(function (second) { 
     // only occurs when first is truthy 
    }); 
+1

Questo è fantastico! – Pipo

0

Zip significa letteralmente così. Si chiude con zip prendendo gli elementi corrispondenti in due diverse sequenze. Quello che stai cercando di ottenere può essere fatto in molti modi diversi.

firstState.combineLatest(secondState, function(f, d) { 
 
    return f == 10 && d > 10; 
 
}).filter(function(val) { return val }) 
 
    .subscribe(function(v) { console.log(v); }); 
 

 
firstState.onNext(10); 
 
secondState.onNext(20);

Questo è uno dei modi.

+0

Grazie per la risposta, ma ho accettato Brandons risposta, perché corrisponde il mio problema ancora meglio. – Pipo

Problemi correlati