2016-11-04 3 views
5

In meiner App Angular2-typescript verwende ich forkJoin, um ein Observable erst zurückzuschicken, wenn alle parallelen HTTP-Aufrufe durchgeführt wurden.Wie kann ich mich von einem Observable, das von forkJoin zurückgegeben wurde, abmelden?

Ausgabe: das Abonnement Rückruf Hier unbegrenzt

ausgeführt wird, hält mein Code:

http.service

import {Http} from "@angular/http"; 

constructor (private _http: HTTP) {} 

makeGetRequest(....) { 
    return this._http.get(URL) 
      .map (res => res.json) 
      .toPromise(); 

my.service

import {Observable} from "rxjs/Observable"; 
import {HttpService} from "http.service" 

constructor (private _httpService: HttpService) {} 

myMethod(): Observable<any[]> { 
return Observable.forkJoin(
      this._httpService.makeGetRequest(
       URL1 
      ), 
      this._httpService.makeGetRequest(
       URL2 
      ) 
     ) 
} 

my.component

import MyService from "my.service"; 
import Subscription from "rxjs"; 

constructor (private _service: MyService) {} 

mySub: Subscription; 

ngOnInit() { 
    this.mySub = this._service.myMethod.subscribe(data => { 
     data.forEach(console.log(data)); 
     this.mySub.unsubscribe(); 
    } 
} 

Was ich (gleiche Ausgabe) versucht:

  • Rückkehr eine beobachtbare in Http.service eher als ein Versprechen
  • in my.component Verwendung .First() .subscribe() statt nur subscribe()
  • put this.mySub.unsubscribe(); am Ende des ngOnInit anstatt innerhalb der Callback-subscribe (auch mit setTimeout (() => ....))
+1

Was meinst du mit 'der Subskriptionsrückruf wird auf unbestimmte Zeit ausgeführt'? – Picci

+2

Die Frage ergibt keinen Sinn. forkJoin verbindet die Ergebnisse von * abgeschlossenen * Observablen und sollte nicht abgemeldet werden, da es einen einzelnen Wert hat. Wenn Sie Schwierigkeiten haben, * auf unbestimmte Zeit * ausgeführt zu werden, geben Sie bitte ein [MCVE] (http://stackoverflow.com/help/mcve) an, das Ihr Problem replizieren kann. – estus

+0

@estus Sie haben Recht. Offensichtlich geschah dies, weil das Abonnement zweimal instanziiert wurde und das Problem verursacht wurde. Fühlen Sie sich frei, die Frage zu beantworten, ich werde es akzeptieren;) – dragonmnl

Antwort

9

Wie forkJoin reference sagt, es

Läuft alle beobachtbaren Sequenzen parallel und sammle ihre letzten Elemente.

Dies bedeutet, dass der Operator Werte von abgeschlossenen Observablen erhält und eine vollständige Observable mit einem einzelnen Wert zurückgibt. Sie müssen sich nicht abmelden.

Verwandte Themen