Frage

Wir haben diese anonyme Funktion in unserem Code, der Teil des Objektparameters Ajax jQuery ist und verwendet einige Variablen aus der Funktion aus aufgerufen wird.

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

Ich habe den zusätzlichen Code weggelassen, aber Sie bekommen die Idee. Der Code funktioniert völlig in Ordnung, aber es Lecks 4 Kbs bei jedem Aufruf im Internet Explorer, so dass ich es, um die anonyme Funktion in ein benannten ein, wie this.onSuccess = function (res) Refactoring will {..}.

Das Problem ist, dass diese Funktion Variablen aus this.invoke (..) verwendet, so kann ich es nicht nur außerhalb seines Körpers nehmen. Wie Refactoring ich richtig diesen Code, so dass es nicht verwenden anonyme Funktionen und übergeordnete Funktionsvariablen?

Aktualisieren. Ich denke ein eigenes Objekt zu schaffen, ist es mit den gleichen Parametern initialisiert, und übergeben ihre onSuccess Funktion als Parameter für jQuery Ajax-Objekt. Obwohl ich vermute, dass es nach wie vor ein Speicherleck wird.

Update 2. Ich habe ein paar Links gefunden was darauf hindeutet, dass die tatsächliche Leck könnte durch jQuery verursacht werden. Einfache jQuery Ajax-Aufruf Speicherlecks in Internet Explorer Speicherleck beteiligt jQuery Ajax fordert

Trotzdem war es gut, einen Weg zu finden, diese Refactoring.

Update 3. ich eine generische Lösung warten wird, bevor eine Antwort zu akzeptieren.

War es hilfreich?

Lösung

Sie können zusätzliche params auf die Ajax-Anforderung hinzufügen, die für den Erfolg Rückruf zugegriffen werden kann:

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

Andere Tipps

1 für hervorragende, ausgezeichnete Frage - ich fühle deinen Schmerz - das ist wirklich schön einkalkuliert wird, wie es ist

.

Ein Vorschlag (und vielleicht ist das, was Sie von Ihrem Update gemeint) ... definiert einen Wrapper für onSuccess und die gewünschte Funktion machen zurückkehren zuweisen. Dann rufen Sie die äußere Funktion und weisen es der „Erfolg“ Option, um die Werte vorbei es braucht. Diese Werte werden auf die Variablen in der inneren Funktion vorbelegt. Nicht wirklich sicher, ob dies helfen wird, - Sie noch mit einer anonymen Funktion am Ende - aber einen Versuch wert

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;
        }
     }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top