Búsqueda de sitios web

javascript - RxJS: ¿Cómo puedo hacer un "if" con Observables?


Supongamos que tengo dos observables y quiero escuchar los cambios en un observable, si el otro cumple cierta condición. Lo intenté con zip, pero parece que solo seré notificado si ambos observables cambian, pero quiero ser notificado por cada cambio en el primer observable, si la condición del otro es verdadera.

Lo que intenté:

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

Me di cuenta de que hay un Rx.Observable.if, pero no pude hacerlo funcionar.

Respuesta #1

Usar pausable:

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

Respuesta #2

Zip literalmente significa así. Se combina tomando elementos correspondientes de dos secuencias diferentes. Lo que estás tratando de lograr se puede hacer de muchas maneras diferentes.

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

Esta es una de las maneras.