angular - RxJs:如果发出的值为空,则有条件的 switchMap
问题描述
我有这个代码:
const id = 1; // id = 2
of([{id: 1, name: 'abc'}]).pipe(
map(items => items.find(item => item.id === id)),
switchMap(item => item ? of(item) : this.makeHttpRequest(id))
);
makeHttpRequest(id: number): Observable<IdNamePair>{}
简而言之,
如果在数组中找到具有特定 id 的对象,则返回 observable of({id: 1, name: 'abc'})
如果在数组中找不到对象,则返回
this.makeHttpRequest(id) 方法返回的 observable
我想消除 of(item) 运算符。
这段代码有效,但是有没有办法不创建一个新的 observable 并重用由 "map()" 创建的那个?
编辑:
export class MyService {
private _list = new BehaviorSubject([{id: 1, name: 'abc'}]);
list = this._list.asObservable();
findOne(id: number) {
this.list.pipe(
map(items => items.find(item => item.id === id)),
switchMap(item => item ? of(item) : this.makeHttpRequest(id))
);
}
}
在 Angular 组件中:
export class MyComponent {
item$: Observable<IdNamePair>;
constructor(private service: MyService) {}
ngOnInit() {
this.item$ = this.service.findOne(1); // or (2), id comes from router
}
}
解决方案
你可以
const id = 1; // id = 2
const [hasItem, noItem] = of([{id: 1, name: 'abc'}]).pipe(
map(items => items.find(item => item.id === id)),
partition(Boolean)
);
const res = merge(hasItem, noItem.pipe(switchMapTo(this.makeHttpRequest(id))
推荐阅读
- html - 彼此放置4个div
- python-asyncio - 未知来源的未关闭客户端会话警告
- java - 用户向列表使用的字符串数组添加新单词(应用程序停止工作)
- swift - Swift:如何使用预处理器为*以下*某个 iOS 版本添加扩展方法?
- python-3.x - Keras 同时期望 2d 数组和 (1,) 的形状
- java - Pyboof:如何在 java 中使用 python 包装器?
- swift - 未调用类委托方法
- python - 为正确的行更改 QTableWidget 项数据
- thread-safety - 循环 QList 时“openmp parallel for”崩溃
- c# - 根级别的数据无效,第 1 行级别 1