Rxjs 5:如何建立Observable链?

时间:2017-03-03 22:30:35

标签: rxjs rxjs5

我是RxJS的新手,我试图实现与MS-Excel完全相同的可观察链。这个概念:假设excel有5列'姓名'年龄'性别'性别'国家','邮编&#39 ;.我们可以独立地对每个列应用过滤器,这也会影响其他列中显示的记录。

这里数据源接收数据后端服务,数据源只有两个函数" addRecord" &安培; " removeRecord&#34 ;.

我是如何尝试在这里实现的,让我说我将创建Observable并附加到数据源,将其称为OBS-1,它将从数据源接收数据。 OBS-1可以有自己的过滤器。假设我将创建另一个Observable OBS-2,它将接收数据OBS-1(如果OBS-1中有任何过滤器,则过滤数据)。另一个Observable说OBS-3再次从OBS-2接收数据(在OBS-2中过滤掉),等等。

如果OBS-2被销毁(取消订阅),OBS-3将从OBS-1接收数据。

我们如何在RxJs中实现这一目标?

1 个答案:

答案 0 :(得分:1)

我认为你误解了Rx的一些事情。 Observables没有过滤器,你没有生活过'添加和删​​除过滤器。观察者也不会根据订阅者转发数据。

相反,您构建了一个调用链。您从源观察开始,例如addRecord中的一个和removeRecord事件中的一个。然后,您链接这些可观察对象以通过Rx中的各种operators形成新的可观察对象,并最终订阅最终的可观察对象。订阅将激活整个链,当源事件触发时,所有操作员都将触发,最终事件将(如果未过滤)到达subscribe

你实际上可以做你在Rx中描述的事情。例如,使用switchMap可以相对轻松地更改observable上的过滤器,filterSource.switchMap(filterFunction => Obs-1.filter(filterFunction))是一个操作符,可以让您将序列投射到另一个序列上,并且每次都切换到新序列。例如var Src-1 = fromEvent(dataSource, 'addRecord') // create the first source var Src-2 = fromEvent(dataSource, 'removeRecord') // and the other source var Obs-1 = Src-1.combineLatest(Src-2) // combine both sources .filter(e => someCondition(e)) // filter the source var Obs-2 = Obs-1.mergeMap(e => someOtherCondition(e) ? Change(e) : Rx.Observable.of(e)) // on someOtherCondition, either transform the source with the `Change(e)` function. Or keep it unchanged with `of(e)` var Obs-3 = Obs-2.filter(e => anotherCondition(e)) // Filter again var sub = Obs-3.subscribe() // activate the sequence. 。甚至比这更简单,您可以取消订阅第一个订阅并再次设置Rx链。然而,使用内置函数会使很多杂耍状态脱离等式。

但是,我强烈怀疑你实际上并不需要这种复杂的行为。你想要的东西可以像这样存档:

var mystr = "Edit the \"Expression\" & Text to see matches. Roll over \"matches\" or the expression for details. Undo mistakes with ctrl-z. Save 'Favorites & \"Share\" expressions' with friends or the Community. \"Explore\" your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial."
var myarr = mystr.split(/\"/g)
var opening=false;
for(var i=1; i<myarr.length;i=i+2){
    if((myarr[i-1].length-myarr[i-1].replace(/'/g,"").length)%2===1){opening=!opening;}
    if(!opening){console.log(myarr[1]);}
}