【问题标题】:RxJS: How can I do an "if" with Observables?RxJS:我怎样才能用 Observables 做一个“如果”?
【发布时间】:2015-02-04 06:42:13
【问题描述】:

假设我有两个 observable,一个我想监听一个 observable 的变化,如果另一个匹配某个条件。我用zip 进行了尝试,但似乎只有在 both 可观察值发生变化时才会通知我,但如果另一个可观察对象的条件为真的。

我尝试了什么:

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,但我无法使用它。

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    使用pausable:

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

    【讨论】:

      【解决方案2】:

      Zip 的字面意思是这样。它以两个不同的顺序压缩对应的元素。你想要达到的目标可以通过许多不同的方式来完成。

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

      这是其中一种方式。

      【讨论】:

      • 感谢您的回答,但我接受了 Brandons 的回答,因为它更符合我的问题。
      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 2021-04-13
      • 2021-10-25
      • 1970-01-01
      • 2011-09-03
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多