【问题标题】:angular rxjs subscribe to second observable onlly if first observable is null仅当第一个 observable 为 null 时,angular rxjs 才订阅第二个 observable
【发布时间】:2020-01-30 10:55:04
【问题描述】:

我有两种方法可以返回 observables。如果先返回一些数据,则无需调用第二个方法。但是如果第一个方法返回 null 那么只调用第二个方法。

getdefaultAddress(id) : Observable<Address[]> { 
    return this.http.get<Address[]>(this.url + 'users/' + id + '/addresses' + '?filter[where][default]=true')
  }

getFirstAddress(id): Observable<any>{
    return this.http.get<any>(this.url + 'users/' + id +'/addresses?filter[limit]=1'  )
  }

在使用 if-else 订阅第一个 observable 后,我可以轻松地做到这一点。 喜欢

this.getdefaultAddress(id).subscibe(data =>{
    if(data) {
      // do something
    }

    else {
      this.getFirstAddress(id).subscibe(data =>{
        // do something
      })
    }
  })

现在我如何在不真正订阅第一个 observable 的情况下检查这个?有 rxjs 运算符吗?

提前谢谢你

【问题讨论】:

    标签: angular rxjs angular8


    【解决方案1】:
    const source1$: Observable<T| null>;
    const source2$: Observable<T>;
    
    const finalSource$ = source1$.pipe(
      switchMap(value => value ? of(value) : source2$) 
    )
    

    只要外部源有值,您就返回它。当它变得未定义/为空时,您切换到 source2$。

    【讨论】:

      【解决方案2】:

      最好使用例如concatMap:

      import { EMPTY } from 'rxjs';
      import { concatMap } from 'rxjs/operators';
      
      this.getdefaultAddress(id)
        .pipe(
          concatMap(data => data === null ? EMPTY : this.getFirstAddress(id)),
        )
        .subscribe();
      

      【讨论】:

      • 这不起作用,因为如果是 data===null,订阅会收到一个 NEVER 结果。
      【解决方案3】:

      我相信你可以使用 switchMap 运算符,我目前无法测试。

      当源发射时,你基本上是在切换到一个新的内部 observable。

      this.getdefaultAddress(id).pipe(
        switchMap(data => {
          if (!data) {
            return this.getFirstAddress(id);
          }
        })
      );
      

      【讨论】:

        【解决方案4】:

        如果您想从某个商店获取数据,如果不存在,则从 API 获取数据,您应该这样做:

        import { of } from 'rxjs';
        import { switchMap } from 'rxjs/operators';
        
        this.getDataFromStorage().pipe(
          switchMap(data => data && data.length ? of(data) : this.requestDataFromAPI())
        );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-26
          • 2019-12-07
          • 1970-01-01
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          相关资源
          最近更新 更多