基于条件的Rxjs条件开关映射

基于条件的Rxjs条件开关映射,rxjs,conditional-statements,switchmap,Rxjs,Conditional Statements,Switchmap,我的情况如下: myObservable1.pipe( 开关图((结果1:MyObservable1)=>{ 如果(条件){ 返回myObservable2; }否则{ 返回(空); } }) ).订阅(myObservable1 | myObservable2)=>{ 因此,如果条件为false,我只需要执行一个请求,如果条件为true,我必须将第一个请求链接到下一个请求,它们本质上是对服务器api的两个请求 是否有更好的解决方案而不返回null? RxJs中有条件运算符吗 谢谢!我不知道您

我的情况如下:

myObservable1.pipe(
开关图((结果1:MyObservable1)=>{
如果(条件){
返回myObservable2;
}否则{
返回(空);
}
})
).订阅(myObservable1 | myObservable2)=>{
因此,如果条件为false,我只需要执行一个请求,如果条件为true,我必须将第一个请求链接到下一个请求,它们本质上是对服务器api的两个请求

是否有更好的解决方案而不返回
null

RxJs中有条件运算符吗


谢谢!

我不知道您的真实代码,这是伪代码,我不知道您现在使用的是哪个rxjs版本,但您可以执行以下操作:

假设您使用的是rxjs 6:

iif(condition, obervable1, concatMap(observable1, observable2))
.subscribe()
不需要返回(null),您应该使用RxJs过滤器操作符

myObservable1.pipe(
  filter((result1) => condition)
  switchMap((result1: MyObservable1) => {
    return myObservable2;
  })
).subscribe((result2) => { ... })

另一种可能是在开关映射中使用运算符iif

但是,它可以抑制控制特定疾病的可能性 可观察到的情况:

myObservable1
.pipe( 
      switchMap(result1 =>
               iif(() => condition
               , myObservable2
               , myObservable1
            )
      )
.subscribe(result => console.log(result)); 
可以用返回布尔值的函数替换“条件”。 具有以下功能:

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 ;
     }
}
正如@amjuhire所说,您可以使用过滤器和开关映射来编写:

myObservable1.pipe(
  filter((result1) => condition)
  switchMap((result1: MyObservable1) => {
    return myObservable2;
  })
).subscribe(result2 => { ... })
 myObservable1.pipe(
      switchMap((result1: MyObservable1) => {
        if (condition) {
          return myObservable2;
        } else {
          // Observable that immediately completes
          return EMPTY;
        }
      })
    subscribe(result2 => console.log(result2));
举你的例子,另一种可能性是:

myObservable1.pipe(
  switchMap((result1: MyObservable1) => {
    if (condition) {
      return myObservable2;
    } else {
      return of(result1);
    }
  })
subscribe(result => console.log(result));
或者在开关映射中使用EMPTY:

myObservable1.pipe(
  filter((result1) => condition)
  switchMap((result1: MyObservable1) => {
    return myObservable2;
  })
).subscribe(result2 => { ... })
 myObservable1.pipe(
      switchMap((result1: MyObservable1) => {
        if (condition) {
          return myObservable2;
        } else {
          // Observable that immediately completes
          return EMPTY;
        }
      })
    subscribe(result2 => console.log(result2));
这里的问题是我们不知道你的可观测数据的类型

所以我无法判断哪种方式更好


它还取决于您希望如何处理observable的不同调用之间的成功/错误。

在我的理解中,您不应该使用
过滤器
操作符,因为在这种情况下,您不会得到任何值

myObservable1.pipe(
  switchMap((value) => {
    return iif(() => condition, myObservable2, of(value));
  })
).subscribe((value) => console.log(value) // either from myObservable1 or from myObservable2)

您可以返回
empty()
observeId,但它会显示:'[ts]无法调用其类型缺少调用签名的表达式。类型“Observer”没有兼容的调用签名。请阅读这篇深入解释它的文章:我认为您的答案是有效的。但我不确定该问题是否专门用于捕获第一个可观察的值。如果筛选器返回true,它将执行switchMap,否则即使不返回任何值,observable1仍将执行value@Koraxos您可能是对的,但给定OP的代码:
subscribe(myObservable1 | myObservable2)
,我假设他/她将对obs1或obs1*obs2中的值进行处理。是的,我理解,这就是为什么我说你的答案是正确的,我同意你的观点。这就是为什么我认为,如果问题更详细一点,我们将能够找到最佳答案