Ich habe eine Promise
. Ich habe es erstellt, um eine AJAX-Anfrage bei Bedarf abzubrechen. Aber da ich diesen AJAX nicht abbrechen muss, habe ich ihn nie gelöst und AJAX erfolgreich abgeschlossen.
Ein vereinfachtes Snippet:
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?
Verursachen solche nie gelösten Versprechen Speicherlecks? Haben Sie Ratschläge zur Verwaltung des Promise
Lebenszyklus?
javascript
angularjs
memory-leaks
promise
angular-promise
Umut Benzer
quelle
quelle
Antworten:
Nun, ich gehe davon aus, dass Sie keinen expliziten Verweis darauf behalten, da dies dazu führen würde, dass es zugewiesen bleibt.
Der einfachste Test, den ich mir vorstellen kann, besteht darin, viele Versprechen zu vergeben und sie nicht zu lösen:
Und dann den Haufen selbst beobachten. Wie wir in den Chrome-Profiling-Tools sehen können, sammelt dies den erforderlichen Speicher, um 100 Versprechen zuzuweisen, und bleibt dann bei weniger als 15 Megabyte für die gesamte JSFIddle-Seite "dort"
Von der anderen Seite, wenn wir uns den Quellcode ansehen
$q
Wir können sehen, dass es von einem globalen Punkt aus keinen Hinweis auf ein bestimmtes Versprechen gibt, sondern nur von einem Versprechen auf seine Rückrufe. Der Code ist sehr gut lesbar und klar. Mal sehen, was passiert, wenn Sie jedoch einen Verweis vom Rückruf auf das Versprechen haben.
Also nach der anfänglichen Zuweisung - es scheint, dass es auch damit umgehen kann :)
Wir können auch einige interessante Muster der GC sehen, wenn wir sein letztes Beispiel noch einige Minuten laufen lassen. Wir können sehen, dass es eine Weile dauert - aber es ist in der Lage, die Rückrufe zu bereinigen.
Kurz gesagt - zumindest in modernen Browsern - müssen Sie sich keine Sorgen über ungelöste Versprechen machen, solange Sie keine externen Verweise darauf haben
quelle
var b = $http.get(...)
oder fügen Sie einen Rückruf hinzu. Das hat auch einen Bezug dazu. Wenn etwas es löst (wie Sie sagten - zu lange zum Auflösen bedeutet immer noch Auflösen), muss es einen Verweis darauf haben. Also ja - es wird nicht GC'd sein