use*_*955 18 conditional-statements rxjs switchmap
我有如下情况:
myObservable1.pipe(
switchMap((result1: MyObservable1) => {
if (condition) {
return myObservable2;
} else {
return of(null);
}
})
).subscribe(myObservable1 | myObservable2) => {
Run Code Online (Sandbox Code Playgroud)
因此,如果条件为假,我只需要执行一个请求,如果条件为真,我必须将第一个请求链接到下一个请求,它们本质上是对服务器 api 的两个请求。
有没有更好的解决方案而不返回它null?
RxJs 中有条件运算符吗?
谢谢!
Kor*_*xos 16
另一种可能性是在 SwitchMap 中使用操作符 iif。
https://www.learnrxjs.io/learn-rxjs/operators/conditional/iif
https://rxjs-dev.firebaseapp.com/api/index/function/iif
但它可以限制控制 Observable 上特定条件的可能性:
myObservable1
.pipe(
switchMap(result1 =>
iif(() => condition
, myObservable2
, myObservable1
)
)
.subscribe(result => console.log(result));
Run Code Online (Sandbox Code Playgroud)
您可以用返回布尔值的函数替换“条件”。有一个功能:
myObservable1
.pipe(
switchMap(result1 =>
iif(() => test(result1)
, myObservable2
, myObservable1
)
)
.subscribe(result => console.log(result));
test(result1) : boolean {
if(result1){
// the iif() will return myObservable2
return true;
}else{
/: the iif() will return myObservable1
return false ;
}
}
Run Code Online (Sandbox Code Playgroud)
就像@amjuhire 说的,你可以用一个过滤器和一个 switchMap 来写:
myObservable1.pipe(
filter((result1) => condition)
switchMap((result1: MyObservable1) => {
return myObservable2;
})
).subscribe(result2 => { ... })
Run Code Online (Sandbox Code Playgroud)
给出你的例子的另一种可能性:
myObservable1.pipe(
switchMap((result1: MyObservable1) => {
if (condition) {
return myObservable2;
} else {
return of(result1);
}
})
subscribe(result => console.log(result));
Run Code Online (Sandbox Code Playgroud)
或者在 switchMap 中使用 EMPTY :
myObservable1.pipe(
switchMap((result1: MyObservable1) => {
if (condition) {
return myObservable2;
} else {
// Observable that immediately completes
return EMPTY;
}
})
subscribe(result2 => console.log(result2));
Run Code Online (Sandbox Code Playgroud)
这里的问题是我们不知道您的 observable 中的类型。
所以我无法判断哪种方式更好。
它还取决于您希望如何处理 observable 的不同调用之间的成功/错误。
jmu*_*ire 11
不需要返回 of(null),你应该使用 RxJs 过滤操作符
myObservable1.pipe(
filter((result1) => condition)
switchMap((result1: MyObservable1) => {
return myObservable2;
})
).subscribe((result2) => { ... })
Run Code Online (Sandbox Code Playgroud)
根据我的理解,您不应该使用filter运算符,因为在这种情况下您不会获得任何价值。
myObservable1.pipe(
switchMap((value) => {
return iif(() => condition, myObservable2, of(value));
})
).subscribe((value) => console.log(value) // either from myObservable1 or from myObservable2)
Run Code Online (Sandbox Code Playgroud)
小智 -1
我不知道你的真实代码,这是伪代码,我不知道你现在使用的是哪个 rxjs 版本,但你可以执行如下操作:
假设您使用的是 rxjs 6:
iif(condition, obervable1, concatMap(observable1, observable2))
.subscribe()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18074 次 |
| 最近记录: |