2016-01-27 5 views
51

Müssen Sie sich von Angular 2 http-Anrufen abmelden, um Speicherlecks zu vermeiden?Ist es notwendig, sich von Observablen, die mit HTTP-Methoden erstellt wurden, abzumelden?

fetchFilm(index) { 
     var sub = this._http.get(`http://example.com`) 
      .map(result => result.json()) 
      .map(json => { 
       dispatch(this.receiveFilm(json)); 
      }) 
      .subscribe(e=>sub.unsubscribe()); 
      ... 
+1

Mögliches Duplikat [Prevent Speicherlecks in Angular 2?] (Http://stackoverflow.com/ Fragen/34461842/verhindern-Speicher-Lecks-in-eckigen-2) –

+1

Siehe http://StackOverflow.com/Questions/34461842/prevent-memory-leaks-in-angular-2 (und die Kommentare auch) –

Antwort

10

die unsubscribe Methode aufrufen, ist eher eine laufende HTTP-Anforderung abzubrechen, da diese Methode die abort ein auf dem darunterliegenden XHR-Objekt aufruft und entfernen Hörer auf die Last und Fehlerereignisse:

// From the XHRConnection class 
return() => { 
    _xhr.removeEventListener('load', onLoad); 
    _xhr.removeEventListener('error', onError); 
    _xhr.abort(); 
}; 

Das heißt, unsubscribe entfernt Hörer ... So könnte es eine gute Idee sein, aber ich denke nicht, dass es für eine einzige Anfrage erforderlich ist ;-)

Ich hoffe, es hilft Ihnen, Thierry

90

So lautet die Antwort nein, du nicht NG2 Bereinigung nach sich

Die Http-Service Quelle, von Angular der Http XHR Backend Quelle:

enter image description here

Beachten Sie, wie es das läuft " vervollständigen ", nachdem Sie das Ergebnis erhalten haben. Dies bedeutet, dass es sich bei Abschluss tatsächlich abmeldet. Sie müssen es also nicht selbst tun. Hier

ist ein Test zur Validierung:

fetchFilms() { 
    return (dispatch) => { 
     dispatch(this.requestFilms()); 

     let observer = this._http.get(`${BASE_URL}`) 
      .map(result => result.json()) 
      .map(json => { 
       dispatch(this.receiveFilms(json.results)); 
       dispatch(this.receiveNumberOfFilms(json.count)); 
       console.log("2 isUnsubscribed",observer.isUnsubscribed); 
       window.setTimeout(() => { 
        console.log("3 isUnsubscribed",observer.isUnsubscribed); 
       },10); 
      }) 
      .subscribe(); 
     console.log("1 isUnsubscribed",observer.isUnsubscribed); 
    }; 
} 

Wie erwartet, können Sie sehen, dass es immer unsubscribed automatisch nach dem Ergebnis zu erzielen und mit den Observablenoperatoren beenden. Dies geschieht bei einer Zeitüberschreitung (# 3), so dass wir den Status der Observable überprüfen können, wenn alles fertig und abgeschlossen ist.

und das Ergebnis

enter image description here

kein Leck als NG2 Auto abmeldet! DANK rubyboy für Hilfe auf diesem ..

+2

gut Fang mit komplett(). Akzeptiere deine eigene Antwort;) – pleerock

0

Auch mit dem neuen Httpclient-Modul bleibt das gleiche Verhalten packages/common/http/src/jsonp.ts