2016-01-27 20 views
51

Czy chcesz anulować subskrypcję wywołań HTTP Angular 2, aby zapobiec wyciekom pamięci?Czy konieczne jest wypisanie się z obserwowalności stworzonych metodami Http?

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

Możliwy duplikat [wycieków pamięci zapobiec na Kątowymi 2?] (Http://stackoverflow.com/ pytania/34461842/prevent-memory-leaks-in-angle-2) –

+1

Zobacz http://stackoverflow.com/questions/34461842/prevent-memory-leaks-in-angular-2 (i komentarze również) –

Odpowiedz

10

Wywołanie metody unsubscribe jest raczej, aby anulować żądanie HTTP w toku, ponieważ ta metoda nazywa abort jeden na bazowego obiektu użyciem nagłówków XHR i usunąć słuchaczy od obciążenia i błędach zdarzeń:

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

To powiedziawszy, unsubscribe usuwa słuchaczy ... Więc może to być dobry pomysł, ale nie sądzę, że jest to konieczne z jednego wniosku ;-)

Mam nadzieję, że ci pomoże, Thierry

90

Więc odpowiedź brzmi: nie, nie NG2 Cleanup po sobie

Źródłem usługi HTTP, z kątowym za Http użyciem nagłówków XHR źródła backend:

enter image description here

Wskazówki, jak biega " zakończyć "po uzyskaniu wyniku. Oznacza to, że faktycznie rezygnuje z subskrypcji po zakończeniu. Więc nie musisz tego robić sam.

Tutaj jest test do sprawdzania poprawności:

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); 
    }; 
} 

Zgodnie z oczekiwaniami, można zobaczyć, że zawsze jest anulowana automatycznie po otrzymaniu wyników, a skończywszy na obserwowalnych operatorów. Dzieje się to po przekroczeniu limitu czasu (# 3), dzięki czemu możemy sprawdzić status obserwowalnego, gdy wszystko zostanie zakończone.

a wynik

enter image description here

brak szczelności NG2 unsubscribes auto! DZIĘKI rubyboy o pomoc w tej sprawie ..

+2

dobre catch z zakończeniem(). Zaakceptuj własną odpowiedź;) – pleerock

0

także z nowym modułem httpclient pozostaje takie samo zachowanie packages/common/http/src/jsonp.ts