2017-02-02 2 views
5

Ich weiß, dass es gute Praxis zu abmelden aus beobachtbaren ist Speicher Leck zu verhindern.Sollte ich Cold Observable abbestellen?

Aber wenn es ist Cold Observable sollte ich mich auch davon abmelden?

Zum Beispiel eine, die von Http.get()

+0

implementieren Sie '.take verwenden können (1)', um die Obs zu zwingen zu beenden und Speicherlecks zu vermeiden. Also: 'http.get (...). Take (1)' – AngularChef

+0

@AngularFrance Wenn Sie auf Quellen https://github.com/ReactiveX/rxjs/blob/master/src/operator/take.ts schauen, werden Sie sieh, dass ja abbestellen wird aufgerufen, aber da seine kalt beobachtbar dann komplett wird auch angerufen werden, so gibt es keine Notwendigkeit zu sagen, nehmen 1, wenn nur 1 zurückgegeben wird –

+0

Ich habe meine Antwort aktualisiert :) –

Antwort

2

Sie brauchen nicht zu tun, es zurückgegeben wird, da für HTTP beobachtbare vollständige ruft sofort ist nach Aktion durchgeführt wird.

Aus dem Quellcode sources kann ich sehen, dass auf unsubscribe auf Fehler und auf vollständig aufgerufen wird.

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

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

ging ich weiter und kleines Experiment tat, indem sie mit Timeout abmelden Zugabe

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

, wenn ich zu

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

Dann this.closed == true innerhalb von unsibscribe Schritt, was bedeutet, abmelden, bevor genannt wurde.

Also ja jetzt kann ich sicher sagen, dass Sie nicht abmelden müssen :)

-1

Es ist definitiv die beste Praxis der verwendeten Speicher in Javascript, genau wie anderen Programmiersprachen zu befreien.

Da Sie angular 2 verwenden, können Sie ngOnDestroy Lebenszyklus-Hook verwenden, um zu erreichen, wie diese Methode ausgeführt wird, wenn die Komponente ihren Gültigkeitsbereich verliert.

Unter der Annahme, dass Sie einen unter Snippet verwenden, um ein Datum

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

Sie sollten abonnieren verwenden OnDestroy Lifecycle-Haken aus Winkel/Kern Importieren einer Import-Anweisung.

import { OnDestroy } from '@angular/core' 

OnDestroy in Ihrer Komponente als

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


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

} 
+0

Warum?Abmelden wird nichts tun –

+0

Ich schlug vor, dies eine gute Praxis zu sein, um ** ngOnDestroy ** für alle Entfernen von Speicherlecks zu verwenden – Aravind

+0

Es ist keine gute Praxis, empfehlen Sie 3 Zeilen Code hinzufügen, warum sie nicht erforderlich sind. Was passiert, wenn ich im Intervall oder in einer Schleife http anrufen, was Sie empfehlen, Array zu erstellen und abzubestellen? –

Verwandte Themen