Ich habe einen Dienst, der alle 2 Minuten meinen Ruhedienst anruft. In meinem Dienst habe ich folgende Funktion
getNotifications(token: string) {
const body = 'xxxxxxxxx=' + token;
return this.http.post('/rest/ssss/ddddddd/notificationcount', body, this.options)
.map((res) => res.json());
}
Auf meiner Komponente rufe ich meine Servicefunktion auf, um die API aufzurufen.
this.notificationService.getNotifications(this.token).subscribe((data) => {
console.log(data);
});
Ich möchte diesen Anruf alle 2 Minuten durchführen. Wie kann ich das am besten tun?
Da Sie Observables
bereits verwenden, nutzen Sie es einfach voll aus :) Obersvable.interval()
ist hier Ihr guter Freund:
Führen Sie in Ihrer Komponente Folgendes aus:
Observable
.interval(2*60*1000)
.timeInterval()
.flatMap(() => this.notificationService.getNotifications(this.token))
.subscribe(data => {
console.log(data);
});
Erläuterung:
.interval()
erstellt ein Observable, das alle 2 Minuten ein Ereignis ausgibt..timeInterval()
konvertiert ein Observable, das Elemente ausstrahlt, in einen , Der Hinweise darauf gibt, wie viel Zeit zwischen diesen Emissionen vergangen ist..flatMap()
umschließt dann Ihren jeden - Dienstaufruf, Wandelt die Ergebnisse in ein Beobachtbares um und gibt es zurück. Damit stellen Sie sicher, dass Ihr Serviceanruf um 0, 2, 4, 6, ... Minute synchron aufgerufen wird. (Denken Sie daran, es gibt viel .then()
), d. h., der Dienst in der 2. Minute wird erst nach dem Anruf in der 0. Minute und der 4. Dienst erst nach der 2. Minute aufgerufen und so weiter..subscribe()
schließlich können Sie die Daten abonnierenWenn Sie Pipeable-Operatoren (RXJS5 und höher) verwenden, leiten Sie die Operatoren einfach weiter, anstatt sie zu verketten:
interval(2 * 60 * 1000)
.pipe(
flatMap(() => this.notificationService.getNotifications(this.token))
)
.subscribe(data => console.log(data))
Wenn Sie keinen http-Anruf tätigen möchten und einfach nach 2 Minuten etwas tun möchten, können Sie wie unten beschrieben etwas tun.
Observable.interval(2*60*1000)
.subscribe(() => {
// do something.
// or callSomeMethod();
});
Es gibt noch eine weitere wichtige Sache, die Sie gerne machen würden: Sie sollten dieses Observable zerstören, sobald Sie Ihre aktuelle Seite verlassen, da Sie nicht möchten, dass die zusätzlichen Berechnungen hinter den Kulissen stattfinden, wenn diese nicht wirklich benötigt werden.
Es gibt mehrere Optionen, um dieses Observable abzubestellen.
Sie sollten den Verweis auf das Observable speichern und ihn in der onDestroy
-Methode abbestellen.
this.observableRef = Observable.interval(60000)
.subscribe(() => {
// do something
});
// call this method in OnDestroy method of the page.
this.observableRef.unsubscribe();
ODER benutze ngx-take-until-destroy
Observable.interval(60000)
.takeUntil(this.destroyed$)
.subscribe(() => {
// do something
});
Wenn Sie rxJs 6+ verwenden, können Sie dazu einfach die Intervallmethode verwenden. so was -
import { interval } from 'rxjs';
interval(3000).subscribe(x => /* do something */)
import {Observable} from 'rxjs/Rx';
Observable.interval(2 * 60 * 1000).subscribe(x => {
callyourmethod();
});
Nach Kommentar aktualisieren
this.interval = setInterval(() => {
this.yourservicecallmethod();
}, 2 * 60 * 1000);