我是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的新的可观察的。