Наблюдаемая периодически пауза, затем продолжение - PullRequest
0 голосов
/ 28 февраля 2020

Как сделать паузу наблюдаемой каждые 15 секунд, затем подождать 5 секунд и продолжить излучение? Я сделал этот пример:

const digits = interval(1000);
const pauser$ = interval(20000).pipe(mapTo(true));
pauser$.subscribe(item =>
  console.log(`${new Date().toISOString()} pause fired`)
);
const pauseStopper$ = pauser$.pipe(
  concatMap(_ => timer(5000)),
  tap(() => console.log(`${new Date().toISOString()} pause stopped`)),
  mapTo(false)
);

const observable = merge(pauser$, pauseStopper$).pipe(
  startWith(false),
  switchMap(paused => (paused ? NEVER : digits))
);

observable.subscribe(
  item => console.log(`${new Date().toISOString()}: ${item}`),
  console.error,
  () => console.log("complete")
);

После первого цикла паузы он ведет себя почти близко к тому, что мне нужно. Любые идеи о том, как сделать это более ясным? Пример стекаблиц

1 Ответ

0 голосов
/ 28 февраля 2020

Я создал функцию player , которая получает три параметра:

  • source $: Ваш наблюдаемый источник должен быть приостановлен / воспроизведен
  • play $: Продолжение испускать ваш источник $ observable
  • pause $: приостанавливает ваш источник $ observable

const player = <T>(source$: Observable<T>, play$: Observable<void>, pause$: Observable<void>): Observable<T> =>
  merge(
    play$.pipe(
      switchMap(() => of(source$))
    ),
    pause$.pipe(
      switchMap(() => of(NEVER))
    )
  ).pipe(
    switchMap(stream => stream)
  )

Эта функция в настоящий момент выдает ошибку, насколько я вижу. За короткое время у меня не получилось исправить ошибку. Ошибка вызвана из (void 0) в паузе $ switchMap. Позже я постараюсь исправить эту ошибку. Удалите ошибку, функция работает.

Теперь вы можете использовать play $ и pause $ Observable для запуска воспроизведения / паузы:

const play$: Observable<void> = interval(20000).pipe(
  startWith(void 0),
  mapTo(void 0)
);

const pause$: Observable<void> = play$.pipe(
  switchMap(() => interval(15000).pipe(
    take(1)
  )),
  mapTo(void 0)
);


const player$ = player(source$, play$, pause$);

Решает ли это вашу проблему? Если есть какие-либо проблемы с решением, дайте мне знать, и я пытаюсь адаптироваться.

...