Pregunta

Tenemos esta función anónima en nuestro código, que es parte de los parámetros del objeto Ajax de jQuery y el que utiliza algunas variables de la función se llama desde.

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

He omitido el código extra, pero usted consigue la idea. El código funciona perfectamente bien, pero se escapa 4 Kbs en cada llamada en el IE, así que quiero refactorearlo para activar la función anónima en una llamada uno, como this.onSuccess = función (res) {..}.

El problema es que esta función utiliza variables de this.invoke (..), así que no puedo acaba de tomar fuera de su cuerpo. ¿Cómo puedo refactorizar el código correctamente, de modo que no utilizar funciones anónimas y variables de la función de los padres?

Actualizar. Estoy pensando en la creación de un objeto separado, inicializarlo con los mismos parámetros, y paso su función onSuccess como un parámetro para el objeto Ajax de jQuery. Aunque sospecho que todavía va a perder memoria.

Actualización 2. He encontrado algunos enlaces que sugieren que la fuga real podría ser causada por jQuery. jQuery Ajax pierde memoria de llamadas en Internet Explorer jQuery Ajax pide

Sin embargo, fue bueno para encontrar una manera de refactorizar esto.

Actualización 3. Voy a esperar por una solución más genérica, antes de aceptar una respuesta.

¿Fue útil?

Solución

Se puede añadir params adicionales a la petición Ajax que se puede acceder en la devolución de llamada de éxito:

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

Otros consejos

1 para una excelente excelente pregunta, - Siento su dolor - esto es realmente muy bien factorizado como está

.

Una sugerencia (y tal vez esto es lo que entiende por su actualización) ... definir una envoltura para onSuccess y hacer que devuelva la función que desea asignar. A continuación, llamar a la función externa y asignarlo a la opción de "éxito", pasando los valores que necesita. Esos valores serán pre-asignados a las variables de la función interna. En realidad no estoy seguro si esto ayudará - todavía se termina con una función anónima - pero vale la pena intentarlo

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;
        }
     }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top