Rxjs条件switchMap基于条件

时间:2018-05-21 16:24:57

标签: rxjs conditional switchmap

我遇到如下情况:

myObservable1.pipe(
  switchMap((result1: MyObservable1) => {
    if (condition) {
      return myObservable2;
    } else {
      return of(null);
    }
  })
).subscribe(myObservable1 | myObservable2) => {

因此,如果condition为false,我只需执行一个请求,如果条件为true,我必须将第一个请求链接到下一个请求,它们实际上是对服务器api的两个请求。

有没有更好的解决方案而不返回'null'? RxJs中是否有任何条件运算符?

谢谢!

4 个答案:

答案 0 :(得分:3)

另一个优点是在SwitchMap中使用运算符iif。

check if a string is numeric in Javascript | Typescript & ES6

但是它可以限制控制特定功能的可能性 可观察条件:

#pragma checksum

您可以在其中用返回布尔值的函数替换“ condition”。 具有功能:

myObservable1
.pipe( 
      switchMap(result1 =>
               iif(() => condition
               , myObservable2
               , myObservable1
            )
      )
.subscribe(result => console.log(result)); 

就像@amjuhire说的那样,您可以使用过滤器和switchMap进行编写:

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 ;
     }
}

给出您的示例的另一种可能性:

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

或在switchMap中使用EMPTY:

myObservable1.pipe(
  switchMap((result1: MyObservable1) => {
    if (condition) {
      return myObservable2;
    } else {
      return of(result1);
    }
  })
subscribe(result => console.log(result));

这里的问题是我们不知道您可观察的类型。

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

这还取决于您如何处理可观察对象的不同调用之间的成功/错误。

答案 1 :(得分:1)

据我所知,您不应使用filter运算符,因为那样的话您将不会获得任何价值。

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

答案 2 :(得分:0)

不需要返回(null),应该使用RxJs过滤器运算符

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

答案 3 :(得分:-2)

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

假设您使用的是rxjs 6:

iif(condition, obervable1, concatMap(observable1, observable2))
.subscribe()