consideri l'esempio di metodo piuttosto standard in angolare J, che aggiorna la vista:Questo modello AJAX è una perdita di memoria?
$scope.fetchResults = function() {
// Some local variable that will cause creation of closure
var hugeData = serviceX.getMilionRecords();
// Any call to any resource with success and error handlers.
$http({
method: "GET",
url: "/rest-api/bulk-operation-x",
params: { someParam: hugeData.length }
}).success(function() {
var length = hugeData.length;
$scope.reportToUser("Success, that was " + length + " records being processed!";
}).error(function() {
var length = hugeData.length;
$scope.reportToUser("Something went wrong while processing " + length + " records... :-(";
});
};
Questo è ovviamente esempio ipotetico, ma mostra ben reticolo, che può essere descritta come riutilizzo delle variabili locali dall'interno Callback AJAX.
Naturalmente in entrambi gestori (success
e error
) stiamo creando una chiusura sopra hugeData
che è direttamente riferimento da gestori di callback.
La mia domanda è: poiché il risultato della chiamata AJAX può essere solo positivo o negativo, il riutilizzo di questo codice causerà la perdita di memoria nel tempo? Risponderei "si", ma non potrei provarlo in modo affidabile nei miei test locali.
Vorrei un guru più esperto per spiegarmelo. Mi piacerebbe ricevere risposta da chiunque lavori con Angular quotidianamente, ma sono gradite anche le risposte jquery.
"Perdita di memoria" è un termine molto specifico che si riferisce alla memoria allocata e successivamente mai liberata. Si applica solo ai contesti in cui la gestione della memoria viene eseguita manualmente. Dato che nella gestione di JS è trasparente per il programmatore, le perdite di memoria sono rilevanti solo se si parla di schemi di codifica che causano perdite di memoria in determinate circostanze, come nel caso delle versioni precedenti di IE. Non sono sicuro che la domanda abbia senso come scritto. – Jon
Non sono d'accordo con il commento di @ Jon. Una cattiva pratica può causare perdite di memoria, come riempire gli oggetti nello scope globale, ecc. In questo caso non lo sarà, poiché l'enorme variabileData viene cancellata non appena una delle callback è terminata (e l'istanza $ http viene ripulita in alto) – rewritten
@Jon, è possibile creare facilmente una perdita di memoria in qualsiasi lingua con gestione della memoria trasparente. Java, Scala, JavaScript, C#, lo chiami. @rewritten, questo è esattamente quello di cui sto parlando. Come sai che 'hugeData' viene cancellato quando' success() 'finisce? Dal punto di vista della lingua, la chiusura usata in 'error()' potrebbe essere eseguita in un secondo momento in futuro. A meno che Angular non faccia qualcosa sotto il cofano (come annullare l'altra callback al termine), allora potremmo avere una perdita di memoria qui. –