2009-12-18 7 views
7

Estoy usando jQuery.getJSON (...) para realizar una llamada/respuesta de proceso para un conjunto de datos ligeramente grande. Se espera un tiempo de respuesta de unos segundos (hay un gráfico de carga animado para aplacar al usuario)."Deje de ejecutar este script" - IE para solicitudes AJAX grandes

Dicho todo esto, el gráfico de carga, la respuesta, el proceso, etc. funcionan bien en todos los navegadores. En Internet Explorer (6/7/8), sin embargo, aparece el error "Deje de ejecutar este script". Si se permite continuar, la secuencia de comandos se completa sin problemas.

$(document).ready(function() { 
    $("#tree").treeview({ collapsed: true, animated: "slow" }); 
    $("#tree").hide(); 

    $("#loadingGraphic").fadeIn("slow"); 

    $.getJSON("mygenerichandler.ashx", function(data) { 
     //manipulate data and add to treeview 

     $("#loadingGraphic").fadeOut("slow", function() { 
      $("#tree").slideDown("slow"); 
     }); 
    }); 
}); 

Soy consciente de que Internet Explorer tiene una preferencia puede establecer a través del registro de Windows, sin embargo, tengo curiosidad de cómo otros desarrolladores mango espera respuestas grandes o lentos de nuevo en una petición AJAX.

+0

Su árbol debe ser monstruoso. –

+0

Sí, la jerarquía no es pequeña. Esto en realidad me hizo pensar en la carga lenta de cada árbol hijo. –

+0

'for..in' generalmente no es una buena forma de iterar a través de matrices. Incluso para objetos, se recomienda una verificación 'hasOwnProperty'. http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays –

Respuesta

4

La notificación de script lento probablemente no sea para la solicitud real, sino para el script que está ejecutando para procesar los datos recibidos por la solicitud. Este también podría ser el código jQuery que analiza su JSON.

Si publica la secuencia de comandos que está "manipulando los datos" (es decir, la parte comentada en su fragmento), quizás podamos ayudar a optimizarla.

[Editar] Tienes razón. Debes considerar la carga lenta del árbol. ¿Cuántos nodos raíz usualmente tienes? Puede tener algo de suerte tomando el appendTo() fuera del circuito. Construya todo el HTML de una vez y realice un enorme appendTo() o use un divisor intermedio no adjunto al DOM para acumular los nodos y luego anexar al elemento principal #tree.

var tempDiv = $('<div></div>'); 
for (var i in data) { 
    tempDiv.append($(buildHierarchy(data[i])); 
} 
$("#tree").append(tempDiv); 
$("#tree").treeview({ add: tempDiv }); //don't know if this works? Maybe tempDiv.children() ? 
+0

Apunte bien. He actualizado el fragmento de script anterior con el ejemplo de código completo, aunque es posible que deba reestructurar la forma en que se realizan las solicitudes (es decir, no rellenar todo el árbol a la vez). –

0

Usted podría refactorizar el código para que usted llamó setTimeout (0) antes de cada llamada recursiva para que la interfaz de usuario ganancias hilo de control y puede ser sensible. Google 'setTimeout threading' para más información.

También podría dividir el gran conjunto de datos en trozos manejados por solicitudes sucesivas. En IE8, es posible que desee comprobar que se está utilizando el método JSON.parse() nativo, ya que es más rápido que una implementación de JS.

2

No es el tiempo de solicitud el problema. La solicitud es asíncrona, por lo que no se ejecuta ninguna secuencia de comandos mientras espera la respuesta.

Es la secuencia de comandos que procesa el resultado que tarda demasiado. Envíalo a una función que se ocupa de una parte de los datos, y llama a sí mismo usando un contador de tiempo para devolver el control al navegador por un momento:

function handleData(data, offset) { 
    // pick the next 1000 items or so: 
    var size = Math.min(1000, data.length - offset); 
    // process [offset .. offset+size-1] of the data 
    // ... 
    offset += size; 
    if (offset < data.length) { 
    window.setTimeout(function() { handleData(data, offset); }, 1); 
    } else { 
    $("#loadingGraphic").fadeOut("slow", function() { 
     $("#tree").slideDown("slow"); 
    }); 
    } 
} 

llama con:

$.getJSON("mygenerichandler.ashx", function(data) { 
    handleData(data, 0); 
}); 
4

Mi conjetura es que no es la carga de los datos ni el procesamiento de los datos que hace en el código. Creo que es la transformación de los datos JSON recibidos a través de HTTP a un objeto JavaScript.

IE básicamente hace un eval() para construir un hash a partir de datos de cadena. Esto es muy, muy, muy ineficiente para cadenas largas. Sospecho que hay un algoritmo Schlemiel the Painter detrás de esto. Tuve exactamente la misma cosa hace uno o dos años y la resolví eliminando datos no utilizados o redundantes de la cadena JSON.

Si no puede acortar la cuerda mediante la eliminación de los elementos, se puede tratar de picar la cadena en el servidor por dividirlo en objetos componentes ('páginas' si se quiere) a buscarlos uno por uno . De esta forma, no tiene que pagar el impuesto de procesamiento ineficaz para cadenas largas y procesar varias cadenas cortas en su lugar.

+0

creo que ese es mi problema –

Cuestiones relacionadas