Question

Nous avons cette fonction anonyme dans notre code, qui fait partie des paramètres de l'objet de jQuery Ajax et qui utilise certaines variables de la fonction est appelée à partir.

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;
            }
        }
   });
}

J'ai omis le code supplémentaire, mais vous voyez l'idée. Le code fonctionne parfaitement bien, mais il fuit 4 Kbs sur chaque appel dans IE, donc je veux qu'il factoriser pour activer la fonction anonyme en un nom d'un, comme this.onSuccess = function (res) {..}.

Le problème est que cette fonction utilise des variables de this.invoke (..), donc je ne peux pas le prendre à l'extérieur de son corps. Comment puis-je Refactor correctement ce code, de sorte qu'il ne pas utiliser des fonctions anonymes et variables de la fonction parent?

Mise à jour. Je pense à la création d'un objet distinct, il initialiser avec les mêmes paramètres, et passe sa fonction onSuccess en tant que paramètre pour l'objet de l'Ajax jQuery. Bien que je soupçonne qu'il fuira encore la mémoire.

Mise à jour 2. J'ai trouvé quelques liens suggérant que la fuite réelle pourrait être causée par jQuery. simple fuite d'appel Ajax jQuery mémoire dans Internet Explorer Fuite de mémoire impliquant les requêtes Ajax jQuery

Mais il est bon de trouver un moyen de factoriser cela.

Mise à jour 3. Je vais attendre une solution plus générique, avant d'accepter une réponse.

Était-ce utile?

La solution

Vous pouvez ajouter des paramètres supplémentaires à la demande ajax qui peut être consulté dans le rappel de succès:

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;
    }
}

Autres conseils

+1 pour une excellente, excellente question - je sens votre douleur - ce qui est vraiment bien pris en compte car il est

.

Une suggestion (et peut-être c'est ce que vous vouliez dire par votre mise à jour) ... définir une enveloppe pour onSuccess et faire revenir la fonction que vous souhaitez affecter. Ensuite, appelez la fonction externe et l'affecter à l'option « succès », en passant les valeurs dont il a besoin. Ces valeurs seront pré-attribués aux variables dans la fonction intérieure. Pas vraiment sûr que cela vous aidera - vous finissez toujours avec une fonction anonyme - mais la peine d'essayer

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;
        }
     }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top