Ist es notwendig, zum abbestellen von observablen erstellt von Http-Methoden?
Müssen Sie die Abmeldung aus Winkel-2 http-Aufrufe zu verhindern, Speicherverlust?
fetchFilm(index) {
var sub = this._http.get(`http://example.com`)
.map(result => result.json())
.map(json => {
dispatch(this.receiveFilm(json));
})
.subscribe(e=>sub.unsubscribe());
...
- Mögliche Duplikate von Verhindern von Speicherlecks im Winkel 2?
- Siehe stackoverflow.com/questions/34461842/... (und die Kommentare)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also die Antwort ist Nein, musst du nicht.
Ng2
wird, reinigen Sie es selbst.Den Http-Dienst Quelle, aus Winkel-Http-XHR-backend-Quelle:
Merken, wie es läuft
complete()
nach dem aufstehen das Ergebnis. Das bedeutet, dass es tatsächlich kündigt vor dem Abschluss. So brauchen Sie nicht, es selbst zu tun.Hier ist ein test zum überprüfen:
Als erwartet, können Sie sehen, dass es immer automatisch abgemeldet, nachdem wir das Ergebnis und beenden mit der beobachtbaren Betreiber. Dies geschieht auf ein timeout (#3), so können wir überprüfen Sie den status des beobachtbaren, wenn es fertig und abgeschlossen.
Und das Ergebnis
So, kein Leck vorhanden wäre als
Ng2
auto abmeldet!Schön zu erwähnen: Diese
Observable
befindet sich in der Kategoriefinite
im Gegenteil zu deninfinite
Observable
die einen unendlichen Strom von Daten kann ausgestrahlt werden, wie DOMclick
Zuhörer zum Beispiel.DANKE an @rubyboy für die Hilfe.
Was sind Sie Menschen reden!!!
OK, es gibt also zwei Gründe, um jederzeit wieder abbestellen zu beobachten. Niemand scheint zu sein, reden viel über die sehr wichtige zweite Grund!
(Für HTTP, die dies tatsächlich auch die Anforderung Abbrechen im browser - so es nicht verschwenden Zeit mit dem Lesen der Antwort. Aber das ist eigentlich nur eine Nebenbemerkung zu meinem wichtigsten Punkt unten).
Die Relevanz der Nummer 2 wird hängt davon ab, was Ihr abonnieren, handler:
Betrachten wir ein paar Fälle:
1) Ein login-Formular. Geben Sie Benutzername und Passwort ein und klicken Sie auf 'Login'. Was, wenn der server langsam ist und Sie sich entscheiden, bei drücken der ESC um den dialog zu schließen? Du wirst wohl davon ausgehen, Sie waren nicht angemeldet, aber wenn die http-Anforderung zurückgegeben, nachdem Sie bei drücken der ESC-dann können Sie immer noch ausführen, was Logik, die Sie da haben. Dies kann dazu führen, dass eine Umleitung zu einer Seite Konto eine unerwünschte login-cookie oder token-variable gesetzt werden. Dies ist wahrscheinlich nicht das, was Ihre Nutzer erwarten.
2) Eine "E-Mail senden" - Formular.
Wenn die
subscribe
handler für 'sendEmail' ist so etwas wie der Auslöser einer 'Ihre E-Mail wird gesendet' animation, übertragen Sie auf eine andere Seite oder versucht, Zugriff auf alles, was entsorgt wurde erhalten Sie möglicherweise Ausnahmen oder unerwünschten Verhalten.Aufpassen, nicht auch davon ausgehen
unsubscribe()
bedeutet "Abbrechen". Sobald die HTTP-Nachricht ist in-flight -unsubscribe()
wird NICHT kündigen die HTTP-Anforderung, wenn es ist bereits auf Ihrem server. Es wird nur dann stornieren, die Antwort kommt zu dir zurück. Und die E-Mail wird wahrscheinlich geschickt bekommen.Wenn Sie das Abonnement erstellen Sie zum senden der E-Mail direkt innerhalb einer UI-Komponente dann würde Sie wahrscheinlich wollen, um sich abzumelden auf entsorgen, aber wenn die E-Mail gesendet wird von einem nicht-UI-zentrale service-dann würden Sie wahrscheinlich nicht brauchen.
3) Eine Winkel-Komponente, die zerstört wird /geschlossen wird. Jede http-observablen läuft noch zu der Zeit abgeschlossen wird, und führen Sie Ihre Logik, es sei denn, Sie kündigen in
onDestroy()
. Ob die Folgen sind trivial oder nicht wird davon abhängen, was Sie tun, in die subscribe-handler. Wenn Sie versuchen, zu aktualisieren, dass etwas nicht mehr vorhanden sind erhalten Sie möglicherweise eine Fehlermeldung.Manchmal können Sie einige Aktionen, die Sie würde wollen, wenn die Komponente angeordnet ist, und einige, die Sie nicht machen würde. Zum Beispiel haben Sie vielleicht ein " swoosh-sound für eine gesendete E-Mail. Sie würde wahrscheinlich wollen, dies zu spielen, auch wenn die Komponente wurde geschlossen, aber wenn Sie versuchen, eine animation auf die Komponente, zu der es scheitern würde. In diesem Fall einige zusätzliche bedingte Logik innerhalb abonnieren wäre die Lösung - und Sie würde NICHT wollen, zu kündigen, wird der http beobachtbar.
So, in Antwort auf die eigentliche Frage, Nein, Sie brauchen nicht zu tun, um Speicherverluste zu vermeiden. Aber Sie müssen es tun, (oft) zu vermeiden, unerwünschte Nebenwirkungen ausgelöst werden, durch ausführen von code, der Ausnahmen auslösen oder beschädigt Ihre Anwendung Zustand.
Tipp: Die
Subscription
enthält eineclosed
boolean-Eigenschaft, die nützlich sein können in fortgeschrittenen Fällen. Für HTTP, das gesetzt wird, wenn es abgeschlossen ist. Im Winkel-es könnte in manchen Situationen nützlich sein um einen_isDestroyed
Eigenschaft inngDestroy
die überprüft werden können, indem Sie Ihresubscribe
hf.Tipp 2: Wenn die Handhabung mehrerer Abonnements können Sie eine ad-hoc -
new Subscription()
Objekt undadd(...)
alle anderen Abonnements - also wenn Sie sich Abmelden aus dem main wird es Abmelden, alle Abonnements zu.Aufruf der
unsubscribe
Methode ist eher zum Abbrechen eines in-progress HTTP-request, da diese Methode ruft dieabort
auf die zugrunde liegenden XHR-Objekt, und entfernen Sie die Zuhörer auf die Last-und error-Ereignisse:Sagte,
unsubscribe
entfernt Zuhörer... So könnte es eine gute Idee, aber ich glaube nicht, dass es notwendig ist, für eine einzelne Anfrage 😉Hoffe es hilft dir,
Thierry
y = x.subscribe((x)=>data = x);
dann eine user-change-in-Eingänge undx.subscribe((x)=>cachlist[n] = x); y.unsubscribe()
hey, Sie verwendet, unsere Ressourcen auf dem server, ich werde Sie nicht werfen Sie Weg ..... und im anderen Szenario: rufen Sie einfachy.stop()
alles wegwerfenAuch mit der neuen HttpClient-Modul bleibt das gleiche Verhalten
Sollten Sie sich nicht Abmelden von observablen, die automatisch vervollständigt (e.g Http-Aufrufe). Aber es ist notwendig, um ein Abonnement unendliche observablen wie
Observable.timer()
.Sollten Sie auf jeden Fall Lesen diese Artikel. Es zeigt Ihnen, warum sollten Sie sich jederzeit selbst aus http.
Update
Den oben genannten affirmation scheint, um wahr zu sein, aber sowieso, wenn die Antwort kommt zurück, der http-Abo ist ohnehin zerstört
Abmeldung ist ein MUSS wenn Sie möchten, eine deterministische Verhalten auf allen Netzwerk-Geschwindigkeiten.
Vorstellen, dass Eine Komponente gerendert wird, in einem tab - klicken Sie auf eine Schaltfläche zum senden einer GET-Anfrage aus. Es dauert 200 ms für die Antwort zurück zu kommen. Ja, sind Sie sicher, um schließen Sie die Registerkarte, in jedem moment zu wissen, dass, die Maschine wird schneller sein als Sie & die http-Antwort verarbeitet und abgeschlossen ist, bevor der tab wird geschlossen und Komponente A wird zerstört.
, Wie etwa auf ein sehr langsames Netzwerk? Klicken Sie auf eine Schaltfläche, die " GET " - Anfrage dauert 10 Sekunden, erhalten Ihre Antwort, aber 5 Sekunden zu warten, Sie sich entscheiden, schließen Sie die Registerkarte. Zerstören Komponente Ein Abfall-gesammelt an einem späteren Zeitpunkt. Warten Sie eine minute!, wir haben nicht Abmelden -- jetzt 5 Sekunden später, eine Antwort kommt zurück, und die Logik in die zerstörte Komponente ausgeführt wird. Die Ausführung ist jetzt als
out-of-context
und kann dazu führen, dass viele Dinge, einschließlich sehr niedriger Leistung.So, beste Praxis ist die Verwendung von
takeUntil()
an-und abzumelden von http-Aufrufe, wenn die Komponente zerstört wird.RxJS beobachtbar sind im Grunde verbunden und auch entsprechend arbeiten, die Sie abonnieren möchten. Wenn wir es schaffen, die beobachtbar ist und die Bewegung, die wir abgeschlossen haben, beobachtbar ist, wird automatisch geschlossen und abgemeldet.
Arbeiten Sie in der gleichen Weise von den Wächtern, die aber ganz anders um.
Die bessere Methode zum Abmelden Sie, wenn die Komponente ist immer zu zerstören.Könnten wir nachträglich tun, indem zB. das.$manageSubscription.unsubscibe()
Wenn wir angelegt haben, die beobachten, wie die unten angeführten syntax wie
**
hin Beobachtbar ist((Beobachter) => {
** //Es macht erkennbar im kalten Zustand
** Beobachter.vollständige()
**})
**