2017-04-21 84 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建议,避免在阵列上一个不必要的迭代。