首页 > 解决方案 > 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>{}

简而言之,

我想消除 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
    }
}

标签: angularrxjs

解决方案


你可以

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))

推荐阅读