使用switchmap停止外部可观察对象而不完成内部可观察对象

时间:2018-12-25 20:10:34

标签: angular typescript rxjs

我已经搜索了一个类似的问题,但是找不到匹配的问题,如果这是重复的,我深表歉意。

我有几个链状的观测值。

Observable A通过switchmap调用Observable B。

现在可观察到的B实际上是一个行为主体,但我认为与该问题无关。

现在可观察到的B永远不会完成。它会不断传递对或错。

Observable B收到值为true时,将通过切换映射调用ObservableC。 可观察的C执行操作并通过switchmap调用其他可观察的对象。依此类推。

我需要做的是,当可观察的B接收到false时,它什么也不做(当前以这种方式设置)。当可观察的B接收到true时,它将调用可观察的C(当前有效)。现在它传播到我的原始订阅,我很乐意接受最后一个可观察到的结果。

但是......它永远不会完成,因为可观察的B永远不会完成。如何使可观察的B完整或取消订阅,而在链发生之后又不停止它呢?因此,当Observable B再次获得.next(true)时,它将再次触发链,而不是我想要的。

我尝试使用takeUntil,它传递了一个可观察到的对象,该对象在收到true时便会触发。 takeUntil的问题是所有内容都立即完成,并且我的订阅从未收到任何值(可观察到的C,并且永不触发)。

这是一些已删除逻辑的代码。

private initMap(): Observable<boolean> {
      return this.platformHelperService.getUserLocation().pipe(
        switchMap(_ => {
         return this.updateMapCenterLocation();

public updateMapCenterLocation(): Observable<boolean> {
    let mapCenterSetObserver: Observer<void>;
    const mapCenterSetObsersable = Observable.create(
      (observer: Observer<void>) => {
        mapCenterSetObserver = observer;
      }
    );

    // This is observable B
    return this.mapAssignedBehaviorSubject.pipe(
        switchMap(assigned => {
        if (assigned) {
          // Observable C below. Later my subscription does more after this completes
          return this.platformHelperService.getUserLocation()
          // If I run below my initial subscription finishes right away and C never runs.
          // If I don't run this, subscription B never completes.
          mapCenterSetObserver.next(undefined);
          mapCenterSetObserver.complete();
        }
   }),
   takeUntil(mapCenterSetObsersable)
   );
  }

1 个答案:

答案 0 :(得分:1)

在可观察到的B中让一次真实通过可能会起作用。

.... 
ObservableA.pipe(
switchMap(()=>observableB.pipe(filter(res=>res),take(1))
switchMap(()=>ObservableC())
)