таймер обратного отсчета rxjs 6 подписаться на angular 6

#javascript #angular #rxjs #countdowntimer

#javascript #angular #rxjs #таймер обратного отсчета

Вопрос:

Я пытаюсь реализовать таймер обратного отсчета в angular 6, используя rxjs 6. Мне также нужно иметь возможность подписываться на результаты и сбрасывать таймер:

Что я пробовал:

 var timer =  interval(1000).pipe(
take(4)
);
timer.subscribe(x => console.log(x));
  

Результат:

 0
1
2
3
  

Что мне нужно, так это отменить таймер, чтобы считать от 3 до 1

Я нашел эту функцию подсчета для реализации обратного подсчета, но я не могу подписаться на нее, как в первом примере

  interval(1000).pipe(
 map((x) => { console.log( x) })
  );
  

Результат:

пусто

Ответ №1:

Вы можете использовать таймер вместо интервала, чтобы фактически реализовать обратный отсчет, вы должны сопоставить результат таймера следующим образом: map(i => countdownStart - i)

   const countdownStart = 3;

  Rx.Observable
    .timer(1000, 1000)
    .map(i =>  countdownStart - i)
    .take(countdownStart   1)
    .subscribe(i => console.log(i));
  

Журналы:
3
2
1
0

Другим возможным решением является использование оператора диапазона.

 Rx.Observable
  .range(0, countdownStart   1)
  .map(i => countdownStart - i)
  .subscribe(i => console.log(i));
  

Журналы:
3
2
1
0

Комментарии:

1. спасибо за ответ, но я все еще пытаюсь реализовать это в RxJS 6, поэтому я получаю ошибки

Ответ №2:

Как насчет?

 var timer =  interval(1000).pipe(
  take(4),
  map(x => 3 - x)
);
timer.subscribe(console.log);
  

Ответ №3:

Вот как я это делаю TimerObservable . Не забудьте отказаться от подписки при уничтожении.

 import {TimerObservable} from "rxjs/observable/TimerObservable";
import { Subscription } from 'rxjs';

export class MyComponent implements OnInit, OnDestroy {

    private sub: Subscription;

    ngOnInit() {
        // Delay 0 seconds, run every second
        let timer = TimerObservable.create(0, 1000);

        let number = 3;

        this.sub = timer.subscribe(t => {
            if(number !== 0) {
               console.log(number);
               number--;
            }
        });
    }

    ngOnDestroy(): void {
        this.sub.unsubscribe();
    }
}