2016-07-23 113 views
2

让我们看看下面的简单情况:过滤器可观察到的由可观察到的

  • 我们有类型的可观察到的苹果可观察<苹果>
  • 每个苹果对象有一个方法isRotten()返回一个可观察的type Observable < Boolean>保证至少发出一个布尔值。

我想过滤可观察到的苹果,使腐烂的苹果不通过过滤器。更确切地说,当且仅当A.isRotten()发出的第一项为false时,苹果A才会通过过滤器。什么是实现这个过滤器的最佳方式?

经过一番思考,我可以想出这样的:

这是用JavaScript编写的
apples 
    .concatMap(apple => 
     apple.isRotten() 
      .first() 
      .filter(bool => bool) 
      .map(bool => apple)) 

。 (... => ...是一个函数)。这是有效的,但我认为这是相当冗长和难以理解的。有没有更好的方式来做这种事情?

回答

2

你有什么是罚款,TBH,我想不出做的更简洁的方式。如果无序苹果不是问题,我可能会使用flatMap而不是concatMap

如果可读性是你的一个问题,只需将执行到它的一个功能(如:filterObservable接受一个函数,它的值,并返回一个IObservable<bool>

+0

感谢您的回答,我希望像filterObservable这样的东西存在。但我想我必须自己实现它。 –

-2

你可以做这样的事情:

var seq = Rx.Observable.from([1, 2, 3, 4, 5, 6]) 
    .filter(x => { 
     let isRotten = true; 
     Rx.Observable.just(x % 2 === 0) 
      .first() 
      .subscribe(val => isRotten = val); 

     if (isRotten) { 
      return x; 
     } 
    }); 

seq.subscribe(x => console.log(x)); 
+0

你确定吗?我不认为这是有效的,因为x.isRotten()不返回布尔值,它返回一个发布布尔值的Observable。 –

+0

我做了下面的提琴,它验证过滤器运算符不能使用Observables。 http://jsfiddle.net/pgcrwauj/ –

+0

@WardBeullens请参阅最新的代码。起初我没有听到你的问题。 –