2017-01-15 5 views
10

Angesichts der folgenden Code, wie kann ich es ändern, um die Get-Anfrage zu "api/foobar" alle 500 Millisekunden wiederholen?Wie zu tun Polling mit Angular 2 Observables

import {Observable} from "RxJS/Rx"; 
import {Injectable} from "@angular/core"; 
import {Http} from "@angular/http"; 

@Injectable() export class ExampleService { 
    constructor(private http: Http) { } 

    getFooBars(onNext: (fooBars: FooBar[]) => void) { 
     this.get("api/foobar") 
      .map(response => <FooBar[]>reponse.json()) 
      .subscribe(onNext, 
        error => 
        console.log("An error occurred when requesting api/foobar.", error)); 
    } 
} 
+0

Ich beantwortete eine ähnliche Frage hier http://StackOverflow.com/a/42659054/2398593 und die Sache ist, dass ich nicht 'Intervall' verwende, denn wenn Ihr Anruf mehr als 500ms dauert, wird ein anderer ausgelöst. Meine Antwort löst dieses Problem :) – Maxime

Antwort

20

sicher, Sie haben Import machen importiert {beobachtbare} von 'rxjs/Rx', wenn wir es nicht importieren wir manchmal

nicht gefunden Fehler beobachtbaren erhalten arbeiten plnkr http://plnkr.co/edit/vMvnQW?p=preview

import {Component} from '@angular/core'; 
import {Http} from '@angular/http'; 
import 'rxjs/Rx'; 
import {Observable} from 'rxjs/Rx'; 

@Component({ 
    selector: 'app', 
    template: ` 
     <b>Angular 2 HTTP polling every 5 sec RxJs Observables!</b> 
     <ul> 
     <li *ngFor="let doctor of doctors">{{doctor.name}}</li> 
     </ul> 

     ` 
}) 

export class MyApp { 
    private doctors = []; 

    constructor(http: Http) { 
    Observable.interval(5000) 
    .switchMap(() => http.get('http://jsonplaceholder.typicode.com/users/')).map((data) => data.json()) 
     .subscribe((data) => { 
      this.doctors=data; 
      console.log(data);// see console you get output every 5 sec 
     }); 
    } 
} 
+0

Wie stoppen Sie das Intervall? Dies läuft alle 5 Sekunden und hört nicht auf. – GravyPlaya

+0

implementieren ngOnDestroy() und abmelden die Observable auf Komponente zerstören –

+2

Dies kann gefährlich sein - wenn die Anforderungen länger als 5000 dauern, wird SwitchMap beim nächsten Mal die vorherige Anfrage abbrechen. Wenn also alle Ihre Anfragen länger als 5000 dauern, wird jeder die nächste abbrechen, und Sie werden keine Umfrage bekommen. (5000 sollte sicher sein, aber 500 wären zu klein) –

-5

Warum nicht versuchen setInterval()?

setInterval(getFooBars(), 500); 
+0

Warum wurde diese Antwort abgelehnt? Leser wie ich wären daran interessiert, warum diese Antwort "schlecht" ist. –

+4

wurde es downvoted, da dies ein reguläres Intervall ist, das das beobachtbare Muster nicht verwendet, während die Frage ist, wie man den Polling (Intervall) -Mechanismus mit Observablen verwendet. Außerdem muss die setInterval-Methode die Funktion getFooBars erzwingen, um die API alle 500 ms auszuführen und auszulösen, die nicht abgebrochen werden können, unabhängig davon, ob eine Antwort zurückgegeben wurde oder nicht. Bei Observablen kann die Ausführung von API abgebrochen werden, wenn dieselbe API erneut ausgelöst wird. – yaloumi

2

Versuchen Sie, diese

return Observable.interval(2000) 
     .switchMap(() => this.http.get(url).map(res:Response => res.json())); 
+0

Vielen Dank für die Antwort. Das schien mir, als würde es auch funktionieren. Allerdings bekomme ich diesen Fehler: "AUSNAHME: Observable_1.Observable.interval ist keine Funktion". Ich benutze RxJS Version 5-Beta. Ist es möglich, das Zurückrollen auf Version 4 zu lösen? –

+0

Ich denke, Sie können in der package.json Datei –

0

ich empfehle die rx-polling Bibliothek, die abs Trakts viele der Details bietet Mechanismen für Wiederholungen, Back-Off-Strategien und sogar Pause/fortsetzen, wenn Browser-Registerkarte inaktiv wird.

Verwandte Themen