2016-11-10 69 views
2

我使用RXJS,我期待能够动态过滤数据,但我有问题:动态过滤rxjs流

let numberSource: ReplaySubject<Number> = new ReplaySubject<Number>(); 
let numberFilter: BehaviorSubject<Number> = new BehaviorSubject<Number>(5); 

let filteredData = numberSource.filter(n => n < numberFilter.value); 
numberFilter.subscribe(newFilter => { 
    filteredData = numberSource.filter(n => n < newFilter); 
    filteredData.subscribe(console.log); // <- I think this is wrong 
}); 

console.log("A"); 
filteredData.subscribe(console.log); 

numberSource.next(1); 
numberSource.next(10); 
numberSource.next(100); 

console.log("B"); 
numberFilter.next(50); 

什么我做的是订阅numberSource,这是该数据我有兴趣展示。我也正在订阅numberFilter,因为我想要对该主题进行任何更改以重放主题,但我认为我做错了。

我期待看到:

A 
1 
B 
1 
10 

我看到:

A 
1 
1 
B 
1 
10 

谁能帮助?

+0

首先,我非常确定,每次运行'numberFilter'的用户时,都不应该将'console.log'订阅到'filterData'。 – Alex

+0

你能做一个你想实现的大理石图吗?该大理石图将具有两个输入流和一个输出流。正如所写的,代码是非常笨拙的流说话方式(嵌套订阅是一种不好的做法),并且很难理解你想要做什么 – user3743222

+0

@alex是啊,这对我来说似乎也是错误的!但我不确定我如何重新启动输出。 – DanDan

回答

1

我想我明白你想要做什么。您想要堆叠由numberSource发出的所有值,以便在numberFilter更改时能够重新发送和过滤它们。

在执行的主要问题是numberFilterBehaviorSubject发射它的默认值(5在这种情况下)你每次订阅它的时间恰好合适就行numberFilter.subscribe(newFilter => ...。此回拨订阅filteredData,然后在console.log("A");之后再次订阅。所以你甚至没有开始发送数据到numberSource,你已经订阅了两次。这就是为什么它给你两次1

简单的解决办法是使用经典Subject,记得unsubscribe()以前的订阅filteredData

let numberSource: ReplaySubject<Number> = new ReplaySubject<Number>(); 
let numberFilter: Subject<Number> = new Subject<Number>(); 

var subscription; 
numberFilter.subscribe(newFilter => { 
    if (subscription) { 
    subscription.unsubscribe(); 
    } 

    subscription = numberSource.filter(n => n < newFilter) 
    .subscribe(console.log); 
}); 

numberFilter.next(5); 

console.log("A"); 

numberSource.next(1); 
numberSource.next(10); 
numberSource.next(100); 

console.log("B"); 
numberFilter.next(50); 

见现场演示:http://plnkr.co/edit/vOaD8tcWlLRdfzU14Ufw

现在它给你你想要的输出。

+0

谢谢!是的,那正是我想要做的,并且您的解决方案确实有效!取消订阅/订阅方法是否是这种做法的惯用rxjs方式? – DanDan

+0

@丹丹既然你想能够重复整个系列的数据,这似乎是最好的方式来做到这一点。我没有看到订阅和取消订阅的问题,这就是'ReplaySubject'的主要目的是能够重复序列。 – martin

+0

辉煌,谢谢!仍然试图让我的头在这一切。 – DanDan