有没有办法从存储为常规Observable的数组中返回单个元素?

时间:2017-12-29 16:52:45

标签: angular typescript rxjs

我使用常规observable(不是observableArray),它保留了一系列元素,如下所示:

public arrayOfItems: IArrayItem[];
public arrayOfItems$: BehaviorSubject<IArrayItem[]> = new BehaviorSubject<IArrayItem[]>(null);

public setArrayOfItems(arrayOfItems: IArrayItem[]): void {
  this.arrayOfItems = arrayOfItems;
  this.arrayOfItems$.next(arrayOfItems);
}

public getArrayOfItems(): Observable<IArrayItem[]> {
  return this.arrayOfItems$.asObservable();
}

我想要实现getSingleItemFromArray方法,该方法应返回arrayOfItems$中的单个元素,我也希望得到它asObservable。像这样的东西(伪代码):

public getSingleItemFromArray(): Observable<IArrayItem> {
  return this.arrayOfItems$.find(item => item.condition).asObservable();
}

如果有可能,请指出正确的方向来实施它。

2 个答案:

答案 0 :(得分:3)

使用Observable.of将参数转换为可观察序列。

import { of } from 'rxjs/observable/of';

public getSingleItemFromArray(): Observable<IArrayItem> {
   let item: IArrayItem = this.arrayOfItems$.find(item => item.condition);
   return Observable.of(item )
}

答案 1 :(得分:3)

由于arrayOfItems$BehaviorSubject的实例,因此您可以根据使用情况使用以下其中一项:

  1. 如果您想重放可以使用的单个值:

    return arrayOfItems$.take(1)
    

    这会发出BehaviorSubject缓存的值,并通过complete以适当的take(1)通知结束链。

    请注意,您不必使用asObservable,因为每个运算符都会返回一个Observable。

  2. 您实际上可以获取存储在BehaviorSubject中的值,并使用Observable返回:

    const val = arrayOfItems$.getValue();
    return Observable.of(val);
    
  3. 我个人使用第一个选项,因为它感觉更“Rx”。