Tut das nie gelöst Versprechen Ursache Speicherverlust?
Ich habe eine Promise
. Ich habe es zu kündigen, einen AJAX-request, wenn nötig. Aber da ich nicht stornieren müssen, AJAX, habe ich nie gelöst und AJAX erfolgreich abgeschlossen.
Einen vereinfachten Ausschnitt:
var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
//do something
});
//Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?
Tun nie gelöst werden verspricht wie die Ursache von Speicherlecks? Haben Sie irgendwelche Ratschläge über den Umgang Promise
Lebenszyklus?
"Nie gelöst" Versprechen, kann noch werden "abgelehnt". Das Wort, das Sie suchen war "offen".
InformationsquelleAutor Umut Benzer | 2013-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, ich nehme an, Sie halten nicht einen expliziten Verweis darauf, da würde es zwingen, zu bleiben reserviert.
Die einfachste Prüfung die ich mir vorstellen könnte ist eigentlich Zuteilung der viel verspricht, und nicht, Sie zu lösen:
Und dann beobachten die Haufen selbst. Wie wir sehen können, in der Chrome-profiling-tools, dieser sammelt die benötigten Speicher zu reservieren eine 100 verspricht und dann einfach "bleibt es" bei weniger als 15 megabyes für die ganze JSFIddle Seite
Von der anderen Seite, wenn wir uns die
$q
QuellcodeKönnen wir sehen, dass es gibt keine Referenz von einem globalen Punkt zu einem bestimmten Versprechen, aber nur von einem Versprechen an seine Rückrufe. Der code ist sehr gut lesbar und klar. Mal sehen, was passiert, wenn Sie haben jedoch eine Referenz aus dem Rückruf zu Versprechen.
Also nach der ersten Zuteilung - es scheint, wie es ist in der Lage zu handhaben, dass so gut 🙂
Wir können auch sehen, einige interessante Muster von GC, wenn wir uns von seiner letzten Beispiel führen Sie für ein paar Minuten mehr. Wir können sehen, dass es eine Weile dauert - aber es ist in der Lage, reinigen Sie die Rückrufe.
In kurzen - zumindest in modernen Browsern - Sie nicht haben, um sorgen über die ungelösten verspricht, solange Sie nicht über externe Verweise auf die
es sei denn, Sie weisen es irgendwo - zum Beispiel, um eine variable:
var b = $http.get(...)
oder fügen Sie einen Rückruf an. Das ist auch ein Hinweis darauf. Wenn sich etwas löst (wie Sie gesagt haben - zu lange, um zu lösen, bedeutet immer noch beheben) - es hat eine Referenz darauf. Also, ja - es wird nicht GC würdeGotcha, das ist, was ich dachte. Die Frage ist also, "Tun Sie das nie gelöst verspricht die Ursache Speicherverlust?" Die Antwort, für den Allgemeinen Gebrauch-Fall, wo ein callback übergeben wird, um das Versprechen, ja. Diese Zeile in deiner Antwort scheint zu widersprechen, dass: "Wir können auch sehen, einige interessante Muster von GC, wenn wir uns von seiner letzten Beispiel führen Sie für ein paar Minuten mehr. Wir können sehen, dass es eine Weile dauert - aber es ist in der Lage, reinigen Sie die Rückrufe." Sorry wenn ich so kleinlich bin und nit-wählerisch, ich versuche nur, um sicherzustellen, dass ich verstehe.
Das scheint nicht wirklich Sinn zu machen. Wenn ich erstellt hatte, 100.000 verspricht, dass die Konsole.log()'ed einige Linie. Ich möchte diejenigen, die 100.000 zu protokollieren diese Zeilen, wenn Sie plötzlich zu beheben, indem Sie einige Magische. Oder werden Sie sagen, dass der browser weiß, dass dies nie beheben, da weder ich noch die aktuelle browser hat Referenz darauf (keine Auswirkungen) - also wie kann das überhaupt wahr sein? (hmm, ich kann sehen, dass wahr sein könnte)
Es gibt einige Wahrheit in diesen Kommentaren und einige, die irreführend, so lassen Sie mich klarstellen: Ein Versprechen mit Handler angebracht könnte bei der automatischen Speicherbereinigung entfernt. Ein Versprechen am Leben gehalten wird (nicht GC-berechtigt), wenn beliebiger der folgenden Bedingungen erfüllt sind: (1) es ist eine Referenz an das Versprechen, das Objekt, (2) es ist ein Verweis auf die "latente" state-of-the promise (das Objekt/die Funktionen, die Sie verwenden, um zu beheben/ablehnen). Außerhalb dieser, das Versprechen ist berechtigt, für GC. (Wenn niemand das Versprechen, und niemand kann seinen Zustand ändern, was ist Ihr Zweck mehr, eh?)
InformationsquelleAutor Benjamin Gruenbaum