通过可观察对象过滤可观察对象

War*_*ens 5 rxjs reactivex

让我们考虑以下简化情况:

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

我要过滤可观察的苹果,以使烂苹果不通过过滤器。更准确地说,当且仅当A.isRotten()发出的第一项为false时,苹果A才会通过过滤器。实施此过滤器的最佳方法是什么?

经过一番思考,我可以想到:

apples
    .concatMap(apple => 
        apple.isRotten()
            .first()
            .filter(bool => bool)
            .map(bool => apple))
Run Code Online (Sandbox Code Playgroud)

用JavaScript编写的。(... => ...是一个函数)。这行得通,但是我认为这是冗长且难以理解的。有没有更好的方法来做这种事情?

Ric*_*lay 4

你所得到的很好,而且,说实话,我想不出更简洁的方法。如果无序的苹果不是问题的话,我可能会使用flatMap而不是。concatMap

如果可读性对您来说是一个问题,只需将实现移至它的一个函数中(例如,filterObservable接受一个接受值并返回一个值的函数IObservable<bool>