2017-08-25 154 views
0

我是新來的反應式編程,它有時候有點複雜。RxJS可觀察的過濾和分組

從服務事件[]

事件看起來給出一個列表就像

Event: 
{ 
beginDate: Date, 
name: string, 
type: State 
} 

State: 
{ 
    PENDING, FINISHED, UPCOMING 
} 

我想組這在以下結構

GroupedByMonthEvent: 
{ 
monthYear: Date, 
event: Event 
} 

在命令行式風格我把它寫:

allEvents$: Observable<Tournament[]>; 
allEventsGrouped$: Observable<GroupedByMonthEvent[]>; 

... 
this.allEvents$ = this.store.select(state => state.events); 

this.allEventsGrouped$ = this.allEvents$.map(t => { 
     return _.chain(t).sortBy(function (value) { 
     return new Date(value.beginDate); 
     }) 
     .groupBy(function (event) { 
      return moment(event.beginDate).format('MMMM YYYY'); 
     }).toPairs() 
     .map(function (events: Event[]) { 
      return _.zipObject(['monthYear', 'events'], events); 
     }) 
     .value(); 
    }); 

接下來我要過濾該Observerable。 我試圖.map和.filter該集合,但我不明白。 現在我只訂閱Observerable並過濾它過時。

有人可以幫助RxJS魔術組合並過濾它在一個簡單的聲明?

回答

0

歡迎來到觀察者的美妙世界。

您可以使用多個ForkJoin觀測量組合成一個:

請參閱此鏈接在這裏:https://www.learnrxjs.io/operators/combination/forkjoin.html

片段:

/* 
    when all observables complete, give the last 
    emitted value from each as an array 
*/ 
const example = Rx.Observable.forkJoin(
    //emit 'Hello' immediately 
    Rx.Observable.of('Hello'), 
    //emit 'World' after 1 second 
    Rx.Observable.of('World').delay(1000), 
    //emit 0 after 1 second 
    Rx.Observable.interval(1000).take(1), 
    //emit 0...1 in 1 second interval 
    Rx.Observable.interval(1000).take(2), 
    //promise that resolves to 'Promise Resolved' after 5 seconds 
    myPromise('RESULT') 
); 
//output: ["Hello", "World", 0, 1, "Promise Resolved: RESULT"] 
const subscribe = example.subscribe(val => console.log(val));