Сброс таймера, когда он достигает нулевого значения - PullRequest
0 голосов
/ 22 марта 2020

Я нашел много примеров того, как сбросить таймер, но они обычно касались ручного сброса (например, событие нажатия кнопки).

Мне нужна логика c, которая будет автоматически сброс значения по окончании обратного отсчета.

Таймер:

type seconds = number;
const getRemainingTime$ = (store: Store): Observable<seconds> => {
  // calculate fullTime based on the TriggerDate extracted from the State
  // ...
  return fullTime$.pipe(
    switchMap((fullTime: seconds) =>
      timer(0, 1000).pipe(
        map((tickCount: number) => fullTime - tickCount),
        takeWhile((remainingTime: seconds) => remainingTime >= 0)
      )
    )
  );
}

Триггер (ожидание значения 0 по таймеру)

getRemainingTime$(this.store).pipe(
    skipWhile((remainingTime: seconds) => remainingTime > 0),
)
.subscribe(data => {
    const newTriggerDate: Date = new Date(new Date().getTime() + 60 * 1000);  // +60 seconds
    this.store.dispatch([new SetTriggerDateAction({ newTriggerDate })]);
});

... и это не работает -

Когда оставшееся время равно нулю, триггер сходит с ума и отправляет бесконечное количество действий. Что не так?

PS: Когда я вручную отправляю SetTriggerDateAction (кнопка onClick), проблема исчезает.

1 Ответ

0 голосов
/ 22 марта 2020

Достаточно было заменить skipWhile на filter.

skipWhile

Все значения выводятся, если условие в skipWhile выполнено хотя бы один раз .


фильтр

Издаются только те значения , которые указаны в условии.

...