Domanda

Abbiamo questo funzioni anonime nel nostro codice, che fa parte di parametri degli oggetti Ajax del jQuery e che utilizza alcune variabili dalla funzione viene chiamata da.

this.invoke = function(method, data, callback, error, bare) {
      $.ajax({
        success: function(res) {
            if (!callback) return;

            var result = "";
            if (res != null && res.length != 0)
                var result = JSON2.parse(res);

            if (bare)
            { callback(result); return; }

            for (var property in result) {
                callback(result[property]);
                break;
            }
        }
   });
}

ho omesso il codice in più, ma si ottiene l'idea. Il codice funziona perfettamente bene, ma perde 4 Kbs per ogni chiamata in IE, quindi voglio refactoring per attivare la funzione anonima in un nominato uno, come this.onSuccess = function (res) {..}.

Il problema è che questa funzione usa variabili da this.invoke (..), quindi non può semplicemente portarlo fuori del suo corpo. Come faccio correttamente refactoring questo codice, in modo che non utilizzare funzioni anonime e le variabili di funzione genitore?

Aggiorna. Sto pensando di creare un oggetto separato, inizializzandolo con gli stessi parametri, e passo la sua funzione onSuccess come parametro per oggetto l'Ajax di jQuery. Anche se ho il sospetto che sarà ancora una perdita di memoria.

Update 2. Ho trovato un paio di link che suggeriscono che la perdita effettiva potrebbe essere causato da jQuery. semplice jQuery Ajax perdite di chiamata di memoria in Internet Explorer richieste jQuery Ajax

Comunque è stato bello per trovare un modo di refactoring questo.

Aggiornamento 3. aspetterò per una soluzione più generica, prima di accettare una risposta.

È stato utile?

Soluzione

È possibile aggiungere params in più per la richiesta Ajax che può essere letta nella callback successo:

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess,
        invokedata: {
         callback: callback,
         bare: bare
        }
    });
};

var onSuccess = function(res) {
    var callback = this.invokedata.callback,
        bare = this.invokedata.bare;
    if (!callback) return;

    var result = "";
    if (res != null && res.length != 0)
        var result = JSON2.parse(res);

    if (bare){
        callback(result); 
        return;
    }

    for (var property in result) {
        callback(result[property]);
        break;
    }
}

Altri suggerimenti

1 per un eccellente, ottima domanda - mi sento il vostro dolore - questo è veramente ben scomposto in quanto è

.

Un suggerimento (e forse questo è ciò che si intende per l'aggiornamento) ... definire un wrapper per onSuccess e farlo ritornare alla funzione che si desidera assegnare. Quindi chiamare la funzione esterno e assegnare all'opzione "successo", passando i valori necessari. Questi valori saranno pre-assegnati alle variabili in funzione interna. In realtà non sono sicuro se questo vi aiuterà - ancora finire con una funzione anonima - ma vale la pena provare

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess(callback, bare);
    });
};

var onSuccess = function(callback, bare) {
     return function() {
        if (!callback) return;

        var result = "";
        if (res != null && res.length != 0)
            var result = JSON2.parse(res);

        if (bare)
        { callback(result); return; }

        for (var property in result) {
            callback(result[property]);
            break;
        }
     }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top