25

我有如下情况:

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

所以如果条件为假我只需要执行一个请求,如果条件为真,我必须将第一个请求链接到下一个请求,它们本质上是对服务器 api 的两个请求。

有没有更好的解决方案而不返回null
RxJs 中有条件运算符吗?

谢谢!

4

4 回答 4

22

另一种可能性是在 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)); 

您可以通过返回布尔值的函数替换“条件”。有一个功能:

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 所说,您可以使用过滤器和 switchMap 编写:

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

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

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

或者在 switchMap 中使用 EMPTY :

 myObservable1.pipe(
      switchMap((result1: MyObservable1) => {
        if (condition) {
          return myObservable2;
        } else {
          // Observable that immediately completes
          return EMPTY;
        }
      })
    subscribe(result2 => console.log(result2));

这里的问题是我们不知道您的 observable 中的类型。

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

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

于 2019-11-11T11:03:07.077 回答
13

不需要返回 of(null),你应该使用 RxJs 过滤器操作符

myObservable1.pipe(
  filter((result1) => condition)
  switchMap((result1: MyObservable1) => {
    return myObservable2;
  })
).subscribe((result2) => { ... })
于 2019-05-31T16:12:57.557 回答
3

据我了解,您不应该使用filter运算符,因为在这种情况下您不会获得任何价值。

myObservable1.pipe(
  switchMap((value) => {
    return iif(() => condition, myObservable2, of(value));
  })
).subscribe((value) => console.log(value) // either from myObservable1 or from myObservable2)
于 2020-06-30T04:55:33.220 回答
-1

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

假设您使用的是 rxjs 6:

iif(condition, obervable1, concatMap(observable1, observable2))
.subscribe()
于 2018-05-23T19:05:19.400 回答