2017-02-02 9 views
5

Wiem, że to dobra praktyka, aby anulować subskrypcję z Observable, aby zapobiec wyciekowi pamięci .Czy powinienem zrezygnować z usługi Cold Observable?

Ale jeśli jest to Cold Observable, czy powinienem również zrezygnować z subskrypcji?

na przykład jeden, który jest zwracany przez Http.get()

+0

Można użyć '.take (1)' zmusić do wypowiedzenia OB i uniknąć wycieków pamięci. A więc: 'http.get (...). Take (1)' – AngularChef

+0

@AngularFrance, jeśli szukasz źródeł https://github.com/ReactiveX/rxjs/blob/master/src/operator/take.ts będziesz zobacz, że tak, anuluj subskrypcję, ale ponieważ jest ona zimna, którą można obserwować, wtedy również zostanie wywołana, więc nie ma potrzeby, aby powiedzieć, weź 1, jeśli tylko 1 zostanie zwrócony –

+0

Mam zaktualizowaną odpowiedź :) –

Odpowiedz

2

nie musisz tego robić, ponieważ HTTP obserwowalne dzwoni pełna jest natychmiast po akcja jest wykonywana.

Z kodu źródłowego sources Widzę, że po wypisaniu się jest wywoływany przy błędzie i po zakończeniu.

protected _error(err: any): void { 
    this.destination.error(err); 
    this.unsubscribe(); 
    } 

    protected _complete(): void { 
    this.destination.complete(); 
    this.unsubscribe(); 
    } 

poszedłem dalej i zrobił mały eksperyment dodając wypisać z limitu czasu

var subscription = this.http.get(`apiurl`) 
      .subscribe(response => { 
       setTimeout(function(){ 
        debugger; 
        subscription.unsubscribe(); }, 30); 
      }); 

gdybym kroku wewnątrz unsibscribe do

Subscriber.prototype.unsubscribe = function() { 
     if (this.closed) { // this.closed is true 
      return; 
     } 
     this.isStopped = true; 
     _super.prototype.unsubscribe.call(this); 
    }; 

Następnie this.closed == true, czyli wypisz nazwano wcześniej.

Więc tak teraz mogę powiedzieć na pewno nie trzeba zrezygnować :)

-1

Jest to zdecydowanie najlepsza praktyka uwolnić zajętej pamięci w javascript podobnie jak innych języków programowania.

Ponieważ używasz kątowego 2, możesz użyć haka cyklu życia, aby uzyskać tę metodę, gdy komponent traci zasięg.

Zakładając, że używasz poniżej fragment zapisać się do danych

subscription = this._http.getMethod('...') 
        .subscribe(response => this.responses = response, 
        error =>this.errorMessage =<any> error) 

należy używać importowania hak cyklem OnDestroy z kątowym/rdzenia przy użyciu instrukcji import.

import { OnDestroy } from '@angular/core' 

wdrożyć OnDestroy w składniku jak

export class MyComponent implements onDestroy { 
    ............. 


    ngOnDestroy() { 
      this.subscription.unsubscribe(); 
    } 

} 
+0

Dlaczego?rezygnacja z subskrypcji nic nie zrobi –

+0

Zasugerowałem, że jest to dobra praktyka, aby używać ** ngOnDestroy ** do usuwania wycieków pamięci. – Aravind

+0

To nie jest dobra praktyka, zaleca się dodanie 3 linii kodu, dlaczego nie są one wymagane. Co jeśli mam w interwale lub w pętli połączenie z http, co poleciłbyś, aby utworzyć tablicę i zrezygnować z subskrypcji? –