我使用常规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();
}
如果有可能,请指出正确的方向来实施它。
答案 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
的实例,因此您可以根据使用情况使用以下其中一项:
如果您想重放可以使用的单个值:
return arrayOfItems$.take(1)
这会发出BehaviorSubject
缓存的值,并通过complete
以适当的take(1)
通知结束链。
请注意,您不必使用asObservable
,因为每个运算符都会返回一个Observable。
您实际上可以获取存储在BehaviorSubject
中的值,并使用Observable返回:
const val = arrayOfItems$.getValue();
return Observable.of(val);
我个人使用第一个选项,因为它感觉更“Rx”。