2017-04-21 60 views
2

具體可觀察 對於學習的角度,我嘲笑做兩件事情Web服務: 過濾器可觀察<T[]>獲得在RxJS

  1. 返回一個可觀測的陣列(Observable<T[]>
  2. 返回標識的項目通過ID作爲可觀察的(Observable<T>

這是我acheved此:

export class Event { 
    constructor(public id: number, public title: string) {} 
} 

const EVENTS = [ 
    new Event(1, 'Tooth extraction'), 
    new Event(2, 'English lesson'), 
    new Event(3, 'Driving lesson'), 
    new Event(4, 'Mortgage meeting'), 
]; 

let eventsObservable: Observable<Event[]> = Observable.of(EVENTS); 

import { Injectable } from '@angular/core'; 

@Injectable() 
export class EventsService { 

    getEvents() { 
     return eventsObservable; 
    } 

    getEvent(id: number|string) { 
     return eventsObservable.concatMap((x) => { 
      return x; 
     }).filter((event: Event) => { 
      return id === event.id; 
     }); 
    }; 
} 

我只開始與觀察到的,棱角分明,不過,我不認爲由於這樣的事實,我的執行getEvent(id: number|string)是最優的是什麼,我做的是:

  1. 德在Observable<T[]>每個項目,
  2. 的Emit 每個那些作爲Observable<T>
  3. 只有然後過濾發射項目要找到一個我在尋找,
  4. 返回此項目爲可觀察到的。

是否有更好,更優化的方式來返回Observable<T[]>的獨特項目?

+0

爲什麼不只是'返回Observable.from(EVENTS.filter(e => e.id === id)))'? – Fabricio

回答

1

有沒有更好,更優化的方式來從Observable返回一個獨特的物品?

使用map它接受一個observable並根據傳遞給該函數的邏輯返回一個新的observable。

getEvent(id: number | string) : Observable<Event> { 
    return eventsObservable.map((x:Event[]):Event => { 
     return x.find(y => y.id === id); 
    }); 
}; 
1

你其實並不需要在所有的這個使用RxJS但我猜你使用觀測量,因爲有連接到他們後來的一些其他功能。

我想的唯一的事情,使這個沒有使用Observable.of(),只是重新發射的價值和使用Observable.from(),遍歷該數組併發出每個值作爲一個單獨的項目更具有可讀性。

let eventsObservable: Observable<Event> = Observable.from(EVENTS); 

... 

getEvent(id: number|string) { 
    return eventsObservable 
     .filter((event: Event) => { 
      return id === event.id; 
     }); 
} 

最後,如果你需要保持事件的數組中Observable<Event[]>你可以用concatAll壓平,這使得它更容易理解。

getEvent(id: number|string) { 
    return eventsObservable 
     .concatAll() 
     .filter((event: Event) => { 
      return id === event.id; 
     }); 
}; 

concatAll()操作者接通Observable<Event[]>Observable<Event>

1

你從字面上想要什麼可以做這種方式:

getEvent(id: number|string) { 
     return eventsObservable.flatMap((x) => Observable.from(x)).filter((event: Event) => { 
      return id === event.id; 
     }); 
    }; 

但要注意,它並沒有太大的意義,而你可以只使用.map(array=>array.find(...))作爲@Igor建議,避免在陣列上一個不必要的迭代。