Отмените подписку, когда подписываете две наблюдаемые друг на друга - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть две наблюдаемые, которые никогда не завершают (они являются обработчиками событий). Каждый раз, когда излучается наблюдаемая А, я хочу отбросить все выбросы В, подождать, пока В излучит значение, и сделать что-то с излучением А; игнорировать дальнейшие выбросы B. Если во время ожидания B А генерирует второй сигнал, я хочу отменить ожидание.

В настоящее время у меня есть следующий код:

obsA$.subscribe(value => {
  obsB$.pipe(take(1)).subscribe(_ => {
    if (value) {
        // do stuff with value
    }
  });
});

Это не распространяется на случай, когда: A испускает один раз, затем A испускает снова, а затем B выдает значение, 1-я подписка на B должна быть отменена, и должна выполняться только вторая подписка.

Как мне подойти к этому вопросу? Есть ли какой-нибудь лучший / более ясный способ написать это?


ObservableA - это событие навигации (переход к новому адресу), а ObsB - из события анимации, которое происходит после навигации. При переходе на новый адрес я хочу дождаться завершения анимации, а затем что-то сделать.

1 Ответ

0 голосов
/ 08 ноября 2018

Похоже, вы описываете switchMap, который всегда подписывается на Observable, возвращаемый из его обратного вызова, и отписывается от предыдущего.

obsA$
 .pipe(
    switchMap(v => obsB$.pipe(mapTo(v))), // pass through only the original emission from obsA$
  )
  .subscribe(resultFromA => ...);
...