Остановка внешней наблюдаемой с помощью switchmap без завершения внутренних наблюдаемых - PullRequest
0 голосов
/ 25 декабря 2018

Я искал похожий вопрос, но не смог найти тот, который соответствует, поэтому извиняюсь, если это дубликат.

У меня есть несколько цепочек наблюдаемых.

Наблюдаемые вызовы А НаблюдаемыеB через switchmap.

Теперь наблюдаемая B фактически является субъектом поведения, но я не думаю, что она имеет отношение к вопросу.

Теперь наблюдаемая B никогда не завершается.Он постоянно передает либо true, либо false.

Observable B вызывает Observable C через карту переключателей, когда получает значение true.Observable C делает вещи и вызывает другие наблюдаемые через switchmap.И так далее, и так далее.

Что мне нужно сделать, так это когда наблюдаемый B получает false, он ничего не делает (в настоящее время настроен таким образом).Когда наблюдаемая B получает истину, она вызывает наблюдаемую C (в настоящее время работает).Теперь он распространяется на мою первоначальную подписку, и я рад сообщить результат моей последней наблюдаемой.

Но ...... он никогда не завершается, потому что Observable 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 голосов
/ 26 декабря 2018

Пусть истина пройдет через один раз в наблюдаемой точке В. Может сработать.

.... 
ObservableA.pipe(
switchMap(()=>observableB.pipe(filter(res=>res),take(1))
switchMap(()=>ObservableC())
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...