webentwicklung-frage-antwort-db.com.de

Wie mache ich mit RXJS alle 2 Minuten einen http-Anruf?

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?

6
Ennio

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:

  1. .interval() erstellt ein Observable, das alle 2 Minuten ein Ereignis ausgibt.
  2. .timeInterval() konvertiert ein Observable, das Elemente ausstrahlt, in einen , Der Hinweise darauf gibt, wie viel Zeit zwischen diesen Emissionen vergangen ist.
  3. .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.
  4. .subscribe() schließlich können Sie die Daten abonnieren

Aktualisieren:

Wenn 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))
23
CozyAzure

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. 

  1. 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();
    
  2. ODER benutze ngx-take-until-destroy

    Observable.interval(60000)
    .takeUntil(this.destroyed$)
    .subscribe(() => {
      //  do something
    });
    
0
Atif Saddique

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 */)
0
Pardeep Jain
import {Observable} from 'rxjs/Rx';

  Observable.interval(2 * 60 * 1000).subscribe(x => {
    callyourmethod();
  });

Nach Kommentar aktualisieren

this.interval = setInterval(() => {
        this.yourservicecallmethod();
    }, 2 * 60 * 1000);
0
Rahul Singh