Функция таймера не срабатывает при последующих событиях - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть следующая функция, которая должна запускать HTTP-вызов Get (getPollResults) каждые 3 секунды. Проблема, которую я вижу, заключается в том, что запускается только начальное событие.

pollResults() {
  return timer(0, 3000)
  .pipe(
    switchMap(() =>  this.pollService.setPollResults()),
    tap(results=> {
      console.log(`updated results: `${results}`);
    })
  );
}

this.pollResults().subscribe()

Если я удаляю switchMap, он работает нормально (я вижу новый журнал консоли каждые 3 секунды). Поэтому я считаю, что это связано с тем, как работает switchMap. Почему это будет препятствовать новым событиям от таймера?

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Можете ли вы показать нам свой код для функции setPollResults? Поскольку switchMap работает должным образом, см. Пример ниже:

const { of, timer } = rxjs; 
const { switchMap, tap, take } = rxjs.operators;


function pollResults() {
  return timer(0, 3000)
  .pipe(
    tap(timerval => console.log(`timer hit: ${timerval}`)),
    switchMap(() =>  of('foo')),
    tap(results=> {
      console.log(`updated results: ${results}`);
    }),
    take(5)
  );
}

pollResults().subscribe()
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>
0 голосов
/ 11 февраля 2020

switchMap отменит текущий запрос, если он занимает более 3000 мс,

, вы можете использовать

mergeMap для отправки всех запросов или

exhaustMap дождаться завершения текущего запроса и отправить новый

...