Мне нужен таймер в Angular 2, который тикает через временной интервал и выполняет некоторую задачу (может вызывать некоторые функции).
Как это сделать с Angular 2?
javascript
angular
кунталь
источник
источник
Ответы:
В дополнение ко всем предыдущим ответам я бы сделал это с помощью RxJS Observables
пожалуйста, проверьте Observable.timer
Вот пример кода, запускается через 2 секунды, а затем тикает каждую секунду:
import {Component} from 'angular2/core'; import {Observable} from 'rxjs/Rx'; @Component({ selector: 'my-app', template: 'Ticks (every second) : {{ticks}}' }) export class AppComponent { ticks =0; ngOnInit(){ let timer = Observable.timer(2000,1000); timer.subscribe(t=>this.ticks = t); } }
А вот и рабочий плункер
Обновление Если вы хотите вызвать функцию, объявленную в классе AppComponent, вы можете выполнить одно из следующих действий:
** Предполагая, что функция, которую вы хотите вызвать, называется func ,
ngOnInit(){ let timer = Observable.timer(2000,1000); timer.subscribe(this.func); }
Проблема с вышеуказанным подходом заключается в том, что если вы вызываете this внутри func, он будет ссылаться на объект подписчика, а не на объект AppComponent, что, вероятно, не то, что вам нужно.
Однако в приведенном ниже подходе вы создаете лямбда-выражение и вызываете внутри него функцию func . Таким образом, вызов func по-прежнему находится в области действия AppComponent. На мой взгляд, это лучший способ сделать это.
ngOnInit(){ let timer = Observable.timer(2000,1000); timer.subscribe(t=> { this.func(t); }); }
проверьте этот плункер на предмет рабочего кода.
источник
timer
вроде бы пользуетсяsetInterval()
. Но вы можете передатьanimationFrame
планировщик (который используетrequestAnimationFrame()
), чтобы использовать его вместоasync
планировщика по умолчанию . Все, что вам нужно сделать, этоObservable.timer(*,*,Scheduler.animationFrame)
, учитывая.import {Scheduler} from ‘rxjs’
Хотя, похоже,timer
это не работает. Похоже, еще пользуетсяsetInterVal()
. Однако в других типах наблюдаемых, таких какObservable.range(0,1000,Scheduler.animationFrame)
, обязательноrequestAnimationFrame
используется. Что касается производительности, я не могу ответить вам точно прямо сейчас.Другое решение - использовать TimerObservable
TimerObservable - это подкласс Observable.
import {Component, OnInit, OnDestroy} from '@angular/core'; import {Subscription} from "rxjs"; import {TimerObservable} from "rxjs/observable/TimerObservable"; @Component({ selector: 'app-component', template: '{{tick}}', }) export class Component implements OnInit, OnDestroy { private tick: string; private subscription: Subscription; constructor() { } ngOnInit() { let timer = TimerObservable.create(2000, 1000); this.subscription = timer.subscribe(t => { this.tick = t; }); } ngOnDestroy() { this.subscription.unsubscribe(); } }
PS: Не забудьте отказаться от подписки.
источник
this.subscription.unsubscribe();
отпадает.import {Component, View, OnInit, OnDestroy} from "angular2/core"; import { Observable, Subscription } from 'rxjs/Rx'; @Component({ }) export class NewContactComponent implements OnInit, OnDestroy { ticks = 0; private timer; // Subscription object private sub: Subscription; ngOnInit() { this.timer = Observable.timer(2000,5000); // subscribing to a observable returns a subscription object this.sub = this.timer.subscribe(t => this.tickerFunc(t)); } tickerFunc(tick){ console.log(this); this.ticks = tick } ngOnDestroy(){ console.log("Destroy timer"); // unsubscribe here this.sub.unsubscribe(); } }
источник
С rxjs 6.2.2 и Angular 6.1.7 я получал:
ошибка. Это было решено заменой
Observable.timer
наtimer
:import { timer, Subscription } from 'rxjs'; private myTimerSub: Subscription; ngOnInit(){ const ti = timer(2000,1000); this.myTimerSub = ti.subscribe(t => { console.log("Tick"); }); } ngOnDestroy() { this.myTimerSub.unsubscribe(); }
источник
Вы можете просто использовать утилиту setInterval и использовать стрелочную функцию в качестве обратного вызова, чтобы
this
она указывала на экземпляр компонента.Например:
this.interval = setInterval( () => { // call your functions like this.getList(); this.updateInfo(); });
В хуке жизненного цикла ngOnDestroy очистите интервал.
ngOnDestroy(){ clearInterval(this.interval); }
источник
Я столкнулся с проблемой, что мне пришлось использовать таймер, но мне пришлось отображать их в двух компонентах одновременно, на одном экране. Я создал timerObservable в сервисе. Я подписался на таймер в обоих компонентах, и что случилось? Он не будет синхронизирован, потому что новая подписка всегда создает свой собственный поток.
Я хотел бы сказать, что если вы планируете использовать один таймер в нескольких местах, всегда ставьте
.publishReplay(1).refCount()
в конец Observer, потому что он будет каждый раз публиковать из него один и тот же поток.Пример:
this.startDateTimer = Observable.combineLatest(this.timer, this.startDate$, (localTimer, startDate) => { return this.calculateTime(startDate); }).publishReplay(1).refCount();
источник
Нашел пакет npm, который упрощает работу с RxJS как сервисом.
https://www.npmjs.com/package/ng2-simple-timer
Вы можете «подписаться» на существующий таймер, чтобы не создавать миллиард таймеров, если вы используете его много раз в одном и том же компоненте.
источник
Если вы хотите запустить метод на ngOnInit, вы можете сделать что-то вроде этого:
импортируйте эти 2 библиотеки из RXJS:
import {Observable} from 'rxjs/Rx'; import {Subscription} from "rxjs";
Затем объявите таймер и частную подписку, например:
timer= Observable.timer(1000,1000); // 1 second for 2 seconds (2000,1000) etc private subscription: Subscription;
Последний, но не менее важный метод запуска при остановке таймера
ngOnInit() { this.subscription = this.timer.subscribe(ticks=> { this.populatecombobox(); //example calling a method that populates a combobox this.subscription.unsubscribe(); //you need to unsubscribe or it will run infinite times }); }
Вот и все, Angular 5
источник
Set Timer and auto call service after certain time // Initialize from ngInit ngOnInit(): void {this.getNotifications();} getNotifications() { setInterval(() => {this.getNewNotifications(); }, 60000); // 60000 milliseconds interval } getNewNotifications() { this.notifyService.getNewNotifications().subscribe( data => { // call back }, error => { }, ); }
источник