RxJS Observables-如何对可观测回报进行条件设置



我是Observables和RxJs的新手,我想对返回进行条件设置。如果第一个选择器返回某个值,我希望从第二个选择器得到一个可观察的值。但是,如果第一个选择器没有返回特定的值,我想返回false(而不是(false((。我已经走了这么远,但这返回了Observable<可观察>。它不应该嵌套。我该怎么做?这是迄今为止的代码:

const condition$: Observable<boolean> =
this.store.pipe(
select(this.firstSelector.get()),
map(item=> {
if (item !== X) {
return of(false)
} else {
return this.store.pipe(select(this.secondSelector.hasValue()))
}
})
)

您就快到了。您应该使用像switchMap这样的高阶映射运算符来返回可观测值。CCD_ 2用于变换和返回来自可观测的数据。

const condition$: Observable<boolean> = this.store.pipe(
select(this.firstSelector.get()),
switchMap(item =>
(item !== X)
? of(false)
: this.store.pipe(select(this.secondSelector.hasValue()));
)
)

因此,如果您想在代码片段中使用if-else构造,您可以执行以下

const condition$: Observable<boolean> =
this.store.pipe(
select(this.firstSelector.get()),
switchMap(item=> {
if (item !== X) {
return of(false)
} else {
return this.store.pipe(select(this.secondSelector.hasValue()))
}
})
)

switchMap操作符将返回一个新的可观测值。

另一种使用if-else的方法是使用分区运算符

const condition$ = this.store.pipe(select(this.firstSelector.get()))

const [_differentItem$, _sameItems$] = partition(condition$, (item) => item !== X);
const differentItem$ = _differentItem$.pipe(mapTo(false))
const sameItem$ = _differentItem$.pipe(switchMap(() => this.store.pipe(select(this.secondSelector.hasValue()))

在第二个示例中,分区运算符将创建两个可观测值,其中第一个(_differentItem$(将在条件求值为true时发出,第二个(_sameItems(将在求值为false时发出

在那之后,我将创建两个包含其余逻辑的管道链,在differentItem$的情况下,我直接使用mapTo运算符将通过它发出的所有值映射到false,对于第二个可观察的sameItem$,我要说的是,当你的源发出(例如,流通过item === X(时,返回指向第二个Selector的新的可观察的。

最新更新