2016-01-27 15 views
51

È necessario annullare l'iscrizione alle chiamate http 2 angolari per evitare perdite di memoria?È necessario annullare l'iscrizione agli osservabili creati con i metodi 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

Eventuali duplicati di [Prevenire perdite di memoria a angolare 2?] (Http://stackoverflow.com/ domande/34461842/prevent-memory-leaks-in-angular-2) –

+1

Vedere http://stackoverflow.com/questions/34461842/prevent-memory-leaks-in-angular-2 (e anche i commenti) –

risposta

10

chiamata al metodo unsubscribe è piuttosto cancellare una richiesta HTTP in corso poiché questo metodo chiama il abort uno sull'oggetto XHR sottostante e rimuovere ascoltatori sugli eventi di caricamento e di errore:

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

Detto questo, unsubscribe rimuove gli ascoltatori ... Quindi potrebbe essere una buona idea ma non penso sia necessario per una singola richiesta ;-)

Spero che ti aiuti, Thierry

90

Quindi la risposta è no, non lo fai NG2 pulizia volontà dopo essersi

La fonte servizio HTTP, da fonte backend Http XHR di angolare:

enter image description here

Notate come si corre il " completare "dopo aver ottenuto il risultato. Ciò significa che in realtà si annulla al completamento. Quindi non hai bisogno di farlo da solo.

Ecco un test per convalidare:

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

Come previsto, si può vedere che è sempre sottoscritte automaticamente dopo avere ottenuto il risultato e finendo con gli operatori osservabili. Questo accade in un timeout (n. 3) in modo che possiamo controllare lo stato dell'osservabile quando è tutto fatto e completato.

e il risultato

enter image description here

nessuna perdita come unsubscribes auto NG2! GRAZIE rubyboy per un aiuto su questo ..

+2

buono prendere con completo(). Accetta la tua risposta;) – pleerock

0

Anche con il nuovo modulo HttpClient, rimane lo stesso comportamento packages/common/http/src/jsonp.ts