Я работаю над видеоплеером с двумя отличительными способами, чтобы определить, следует ли подписаться на наблюдаемое или нет. это _videoInfo $ и _exit $. Это потоки, которые выдают значения при вызове на проигрывателе.

У меня есть наблюдаемая переменная _data $, которая выдает все значения, которые мне нужно отслеживать, но я хочу подписаться на нее только во время воспроизведения видеоплеера.

Я знаю, что следующий подход неверен, но он объясняет, чего я пытаюсь достичь. В настоящее время это не работает, потому что я не могу отписаться от _data $.

 const _data$ = data$.subscribe(event => {
  // data I need when video is playing
});

_videoInfo$.subscribe((res): void => {
  // when res emits it means a new video is starting
  _data$.subscribe();
});

_exit$.subscribe({
 next: () => {
  _data.unsubscribe(); // this does not work, but i want to unsubscribe here
 },
 error: () => {},
 complete: () => {}
});

Как я могу подписаться на _data $, когда $ videoInfo выдает значение, и отписаться от него, когда _exit $ выдает значение?

1
jschuss 28 Окт 2019 в 06:37

2 ответа

Лучший ответ

observable.subscribe() возвращает объект Subscription, который можно использовать для отмены подписки.

let subscription;

_videoInfo$.subscribe((res): void => {
  // when res emits it means a new video is starting
  subscription = _data$.subscribe();
});

_exit$.subscribe({
 next: () => {
  if (subscription) {
   subscription.unsubscribe(); 
  }
 },
 error: () => {},
 complete: () => {}
});
1
Kirill Simonov 28 Окт 2019 в 03:50

Операторский способ:

_data$.pipe(skipUntil($videoInfo),takeUntil(_exit$)).subscribe()
1
Fan Cheung 28 Окт 2019 в 04:32