javascript - RxJS: Gözlemlerle (Observables) bir "if" nasıl yapabilirim?


Diyelim ki iki gözlemlenebilirim var ve birisindeki değişiklikleri dinlemek istiyorum, diğerinin belirli bir koşulu sağladığı durumlarda. Bunu zip ile denedim ama sadece her iki gözlemlenebilir değiştiğinde bildirim alıyor gibi görünüyordu, oysa ben diğerinin koşulu doğruysa bir gözlemlenebilirdeki her değişiklik için bildirim almak istiyorum.

Denediğim şey:

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

Rx.Observable.if olduğunu fark ettim, ama çalıştıramadım.

Cevap #1

Durdurulabilir kullan:

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

Cevap #2

Zip kelimenin tam anlamıyla 'böyle' demektir. İki farklı dizideki karşılık gelen elemanları alarak sıkıştırır. Başarmaya çalıştığınız şey birçok farklı şekilde yapılabilir.

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

Bu yolların bir tanesidir.