Rxjs根据另一个流过滤可组合流

时间:2016-05-06 05:55:02

标签: javascript angular rxjs

我有一个cars数组,其中包含属性:

cars: <Car[]> = [
    {
        color: 'red',
        make: 'mazda',
        year: 1960
    },
    {
        color: 'blue',
        make: 'mazda',
        year: 1984
    },
    {
        color: 'red',
        make: 'honda',
        year: 1999
    }
]

正在修改可观察的updatesToCars,并通过carsObservable.scan将其分配给另一个可观察的.cache

let initialCars = cars;
carsObservable = updatesToCars.scan(
    (cars: Car[], operation /* some crud operation that modifies the cars array */) => {
        return operation(cars);
    }, initialCars
).cache();

carsObservable现在拥有最新的汽车列表。凉!我们现在要说的是,我想过滤所有具有特定品牌的汽车,同时牢记兼顾性:

carsOfACertainMake = new BehaviorSubject('mazda');
filteredCarsOfACertainMake = carsOfACertainMake.map((make) => {
    return carsObservable.map((cars) => {
        return _.filter(cars, function(car) {
            return car.make === make;
        });
    });
}).switch().cache();

现在我们可以carsOfACertainMake.next('honda')filteredCarsOfACertainMake可观察对象仅反映具有[{1}}品牌价值的汽车。

每次需要过滤不同的make时,我们必须清空honda observable。

这有效,但似乎是一种实现此类功能的奇怪方式。 filteredCarsOfACertainMake可观察到的可以实现吗?如果是这样,所需的代码是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找combineLatestwithLatestFrom

var carsOfACertainMake = new BehaviorSubject('mazda');
carsObservable.withLatestFrom(carsOfACertainMake, (cars, make) =>
  _.filter(cars, car => car.make === make)
).cache();

filter在这种情况下不会对你有很大的帮助,因为它无法真正处理变异标准的情况。相反,withLatestFrom将避免从上方重新订阅费用,并且每次carsObservable发出时都会使用最新的过滤器集发出。