2017-05-18 1 views
0

Ich versuche, Polling zu bekommen innerhalb von Angular 2 mit Observables arbeiten. Ich weiß, dass da draußen eine Reihe anderer Antworten sind, aber ich kann sie nicht dazu bringen, für mich zu arbeiten.Http-Service-Polling mit Observablen

Ich weiß, es ist eine reine Verständnis Sache, so eine Erklärung der Antwort (was ihre tun und warum) und nicht reiner Code würde geschätzt.

test.service.ts

@Injectable() 
export class EtlService { 

constructor(private http: Http) { } 

//Get ETL by status 
get(): Observable<EtlByStatus> { 
    var url = 'someURL'; 

    return this.http 
     .get(url) 

     .map(response => { 
      return { 
       headers: response.json().data.headers, 
       dataSet: response.json().data.data 
      } 
     }); 
} 

Aufruf dieser Service mit einer einfachen Zeichnung wie erwartet funktioniert:

this._service 
      .get() 
      .subscribe(
       res=> { 
        this.headers= res.headers; 
        this.data = res.dataSet; 
}); 

Allerdings ist mein Problem Polling. Wie am besten ich sagen kann, sollte Polling aus erfolgen innerhalb der Component, damit der Dienst mehr wiederverwendbar sein - die HTTP-Anforderung ist einfach und kann eine beliebige Anzahl von Arten verarbeitet werden.

test.component.ts

pollGet(timer: number = 30000): Observable<GetInterface> { 
     return Observable.interval(timer) 
      .switchMap((res) => { 
       this._service.get(); 
      }) 
      .map(res => res) 
      .subscribe(res => { 
       console.log('testing'); 
      }) 
    } 

Die oben genannten Erträge res => void is not assignable und type void is not assignable to type ObservableInput. Ich habe versucht, die get-Linie in der Mitte in eine Rückkehr zu drehen, und das gibt mehr Fehler und gibt Nachrichten zurück, die subscribe eine Funktion ist.

Als solche wie Sie Observables für die Abfrage verwenden? Ich bin sicher, es ist mein Verständnis von map, switchMap und subscribe und wie sie alle als Teil eines observable spielen, aber ich kann es nicht herausgefunden.

+0

Mögliche Duplikat [beobachtbare Polling?] (Http://stackoverflow.com/questions/42657380/observable-polling) – stevenvanc

+0

Es ist ähnlich, aber die Top-Antwort Intervalle nicht verwendet. Die zweite Antwort tut das, aber es gibt keine Erklärung dafür, was der Code macht oder warum. – Doug

Antwort

1

Ihre Funktion pollGet ist auch dabei Observable<GetInterface> zurückzukehren, basierend auf wiederverwendbares Prinzip, so dass die schließlich abonnieren hier nicht taugt, weil sie die Rückkehr Typ subscription verwandeln wird.

über switchMap:

switchMap wird zum Kombinieren von beobachtbaren Kette verwendet, die die Observable in switchMap auf dem Ergebnis des ursprünglichen Observable basieren. Hier sollten Sie den Typ Observable in switchMap zurückgeben.

entsprechend Ihrem Code, die beobachtbaren in switchMap sind nicht zu irgendwelchen ursprünglichen beobachtbaren Ergebnissen verwandt, so dass Sie hier einfach map verwenden können.

so dass der endgültige Arbeitscodeblock würde wie unten sein:

pollGet(timer: number = 30000): Observable<any> { 
    return Observable 
       .interval(timer) 
       .map(() => { 
        //return this.http.get('111'); 
        // make sure your r_service.get return an Observable as the example above: http.get 
        return this._service.get(); 
       }) 
       .map(res => res); 
} 
+0

Können Sie erklären, warum Sie 'map' zweimal verwenden? Ich kämpfe darum, den richtigen Kontext zu finden, aber es ist die Frage, nach der ich gefragt habe. Danke – Doug

+0

Die zweite Karte tut nichts, diese Antwort funktioniert nicht für mich aus irgendeinem Grund ... – Eeks33

+0

@Doug die erste Karte wird einen neuen Stream von Ihrem '_service.get' erstellen und die zweite' map' basiert auf was Sie möchten von '_service.get' zurückkehren. Sie können also 'response' it self oder' response.data' oder 'response.data.xxx' in der zweiten Map zurückgeben. – Pengyy

0

Ihre Karte muss innerhalb der switchMap sein. Ich glaube, switchMap ist die korrekte Verwendung hier, weil Sie eine neue Observable zurückgeben möchten, nicht die Ganzzahl, die Intervall ausgibt. Was Sie tun müssen, ist Ihre Karte anhängen, um die http/Service-Antwort zu verarbeiten.

pollGet(timer: number = 30000): Observable<GetInterface> { 
    return Observable.interval(timer) 
    .switchMap((intervalCounter) => { 
     return this._service.get() // note that you need a return here, or inline return 
     .map(res => res); 
    }) 
    .subscribe(res => { 
     console.log('testing'); 
    }) 
}