Ich brauche einen Timer in Angular 2, der nach einem Zeitintervall tickt und eine Aufgabe erledigt (kann einige Funktionen aufrufen).
Wie geht das mit Angular 2?
javascript
angular
kuntal
quelle
quelle
Antworten:
Zusätzlich zu allen vorherigen Antworten würde ich RxJS Observables verwenden
Bitte überprüfen Sie Observable.timer
Hier ist ein Beispielcode, der nach 2 Sekunden startet und dann jede Sekunde ankreuzt:
Und hier ist ein funktionierender Plunker
Aktualisieren Wenn Sie eine in der AppComponent-Klasse deklarierte Funktion aufrufen möchten, haben Sie folgende Möglichkeiten:
** Angenommen, die Funktion, die Sie aufrufen möchten, heißt func .
Das Problem mit dem obigen Ansatz besteht darin, dass, wenn Sie 'this' in func aufrufen, es auf das Abonnentenobjekt anstatt auf das AppComponent-Objekt verweist, was wahrscheinlich nicht das ist, was Sie wollen.
Im folgenden Ansatz erstellen Sie jedoch einen Lambda-Ausdruck und rufen die darin enthaltene Funktion func auf . Auf diese Weise befindet sich der Aufruf von func immer noch im Bereich von AppComponent. Dies ist meiner Meinung nach der beste Weg, dies zu tun.
Überprüfen Sie diesen Plunker auf Arbeitscode .
quelle
timer
scheint zu verwendensetInterval()
. Sie können jedoch denanimationFrame
Scheduler (der verwendetrequestAnimationFrame()
) übergeben, um ihn anstelle des Standard-async
Schedulers zu verwenden. Alles, was Sie tun müssen, istObservable.timer(*,*,Scheduler.animationFrame)
gegeben.import {Scheduler} from ‘rxjs’
Allerdingstimer
scheint es nicht zu funktionieren. Es scheint immer noch zu verwendensetInterVal()
. Bei anderen Arten von Beobachtungsobjekten wieObservable.range(0,1000,Scheduler.animationFrame)
demrequestAnimationFrame
wird das jedoch mit Sicherheit verwendet. In Bezug auf die Leistung kann ich Ihnen derzeit nicht sicher antworten.Eine andere Lösung ist die Verwendung von TimerObservable
TimerObservable ist eine Unterklasse von Observable.
PS: Vergiss nicht, dich abzumelden.
quelle
this.subscription.unsubscribe();
Abbestellen.quelle
Mit rxjs 6.2.2 und Angular 6.1.7 bekam ich eine:
Error. Dies wurde behoben, indem ersetzt wurde
Observable.timer
durchtimer
:quelle
Sie können einfach das Dienstprogramm setInterval verwenden und die Pfeilfunktion als Rückruf verwenden
this
auf die Komponenteninstanz wird.Zum Beispiel:
Löschen Sie das Intervall in Ihrem ngOnDestroy-Lebenszyklus-Hook.
quelle
Ich hatte das Problem, dass ich einen Timer verwenden musste, aber ich musste sie in zwei Komponenten gleichzeitig und auf demselben Bildschirm anzeigen. Ich habe das timerObservable in einem Dienst erstellt. Ich habe den Timer in beiden Komponenten abonniert, und was ist passiert? Es wird nicht synchronisiert, da ein neues Abonnement immer einen eigenen Stream erstellt.
Was ich sagen möchte, ist, dass, wenn Sie einen Timer an mehreren Stellen verwenden möchten, immer
.publishReplay(1).refCount()
am Ende des Observers stehen, da dieser jedes Mal den gleichen Stream daraus veröffentlicht.Beispiel:
quelle
Ich habe ein npm-Paket gefunden, das dies mit RxJS als Service einfach macht.
https://www.npmjs.com/package/ng2-simple-timer
Sie können einen vorhandenen Timer abonnieren, sodass Sie keine Unmengen von Timern erstellen, wenn Sie ihn mehrmals in derselben Komponente verwenden.
quelle
Wenn Sie eine Methode für ngOnInit ausführen möchten, können Sie Folgendes tun:
Importieren Sie diese 2 Bibliotheken aus RXJS:
Dann deklarieren Sie Timer und privates Abonnement, Beispiel:
Last but not least Methode ausführen, wenn der Timer stoppt
Das ist alles, Angular 5
quelle
quelle