Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    richieste ajax e ram nei telefonini

    ciao

    sto lavorando su dei widget per telefonini e sono un po preoccupato per questioni tipo "risorse succhiate" e ram. sto anche scrivendo un piccolo framework javascript. in particolare sto scrivendo un oggetto per le richieste ajax. mi deveo fidare del garbage collector? o dovrei fare in modo di eliminare l'oggetto ajax una volta che ho finito di usarlo?

    per esempio dopo aver fatto le manipolazione del dom a dati ricevuti potrei fare una cosa del genere:

    delete myAjaxObj;

    funzionerebbe?

  2. #2
    Ciao,

    Guarda, io non sono un esperto, ma la tua domanda mi ha incuriosito, quindi ho goolgato un po' in giro ed ho avuto un paio di illuminazioni:

    GC (GarbageCollector) in JS non può essere chiamato, perché non esiste un metodo per farlo. Semplicemente, il GC periodicamente fa lo scan dell'albero (così lo chiamano) delle reference definiti (Oggetti e variabili, insomma), come il GC di Java.

    La questione un po' problematica, sono gli eventi: se leghi una funzione ad un evento di window (o di un oggetto che rimane persistente) allora la funzione stessa non verrà mai distrutta dal GC. Questo, credo, perchè non ne sono sicuro, ha effetto anche sulle variabili o oggetti definiti nella funzione.

    Credo che il modo migliore per distruggere il tuo oggetto Ajax sia di di slegate tutti gli eventi che in qualche modo lo toccano e settare la variabile che lo contiene a null. Al successivo giro di GC verrà cancellato dalla memoria.

    Ma se il tuo problema era di cancellare subito l'oggetto, perché temi che la memoria si saturi quando ne instanzi diversi, allora ti consiglio di concentrarti piuttosto sul riutilizzo dell'oggetto che sulla sua cancellazione. Voglio dire, io uilizzo Mootools, che ha l'oggetto Request.HTTP per usare Ajax, questo oggetto ha un problema: una volta istanziato non c'è modo di cambiare la funzione che verrà chiamata all'evento onComplete (almeno io non ho trovato il modo, se qualcuno lo conosce e me lo dice gli sarò grato per tutta la vita), quindi, a meno di non creare una marea di if a cascata nella funzione, lo si può riutilizzare fino ad un certo punto. Se, invece, crei un oggetto che, in ogni momento, con la stessa istanza, puoi modificare sia l'action, sia le funzioni che chiama al verificarsi degli eventi, ed anche la query passato al file action, crei uno strumento utilissimo, perché con un'istanza, puoi fare tutto quello che hai bisogno, senza mai richiamare il new che alloca altra memoria.

    Spero di essermi spiegato, ciao.

  3. #3
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    grazie per l'impegno. sei stato molto chiaro.

    Ad ogni modo penso che il riutilizzo sia altrettanto problematico. mi spiego:

    facciamo finta che una chiamata ajax (diaciamo A1) sia stata inizializzata. e facciamo anche finta una seconda (A2) venga laciata subito dopo (e prima che A1 abbia ricevuto i dati dal server e la sua callback sia stata eseguita). Nel caso in cui optassimo per la "riutilizzazione" ci troveremmo a riutilizzare lo stesso oggetto. I metodi di tale oggetto verrebbero sovrascritti e questo potrebbe (per la natira asincrona dell'oggetto in questione) avvenire prima che A1 abbia terminato il suo ciclo di vita. per esempio potresti finire a manipolare con la callback di A2 i dati restituiti dal server in relazione alla chiamata fatta da A1. non molto piacevole. invece io suggerisco un pezzo di codice cosi:

    codice:
    XHR.onreadystatechange = function(){
    		if(XHR.readyState === 4){
    			if(XHR.status == 200){
        			      //do things with the responseText or responseXML and then
        			      delete XHR; // dealloca la memoria a fine delle manipolazione DOM
    			}	
    			// per qualche motivo la richiesta non ha successo
    			else{
    				alert("Sorry but the Request has failed");
    			}
    		}
    	}
    does it make sense?

  4. #4
    Sei stato chiaro, in ogni caso, non si può chiamare il GC, puoi solo eliminare l'istanza (settando a null il reference) ed aspettare il prossimo ciclo di GC.

  5. #5
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    si esatto! il che mi basta e avanza! io voglio tenere la memoria il piu' libeara possbile. quindi suppongo che un

    XHR = undefined

    sia piu' leggero dell'oggetto asincrono con tutti i metodi e le proprieta'. che dici?

  6. #6
    Si, hai ragione, l'unica cosa che ti raccomando è di riutilizzare il più possibile gli oggetti, evitando di usare new tutte le volte che puoi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.