2010-12-06 8 views
7

Estoy recorriendo varios elementos y haciendo una solicitud de ajax para cada uno de ellos (utilizando jQuery). Quiero que se ejecuten de forma independiente, pero que se llenen en el DOM en el orden en que fueron llamados, no en el orden en que se devuelven (por alguna razón, algunas solicitudes tardan más que otras). ¿Algún consejo sobre la mejor práctica para este tipo de cosas?Mantener el orden de las solicitudes al hacer varias devoluciones de llamada ajax

+0

adjuntar un campo de petición de orden de cada uno y tener los datos almacenados en un poco global de la memoria (tal vez se adhieren a un "div holding") y en cada llamada éxito una módulo común que intentará cargarlos todos si todos han tenido éxito. Parece que vas a tener bastantes mutexes para mantener los patrones para este diseño. ~~ En cuanto a las mejores prácticas, simplemente mantenga el código limpio y legible. – jcolebrand

Respuesta

1

Puede enviar todos los objetos de resultados exitosos a una cola. Tener un índice que se envió con la solicitud original y verificar continuamente esa cola para el siguiente índice.

Pero, en general, los navegadores solo permiten dos solicitudes simultáneas de ajax, por lo que puede valer la pena simplemente enviar la siguiente solicitud de AJAX al éxito de la solicitud anterior.

Aquí es un comienzo en el código:

var results = {}, lastProcessedIndex = 0; 
var totalLength = $('a.myselector').each(function(el, index){ 
    $.ajax({ 
     url: $(this).attr('href'), 
     success: function(result){ 
      results[index] = result; // add to results object 
     } 
    }); 
}).length; 

var intervalId = setInterval(function(){ 
    if(results[lastProcessedIndex]){ 
     // use object 
     lastProcessedIndex++; 
    } 
    else if(totalLength == lastProcessedIndex){ 
     clearInterval(intervalId); 
    } 
}, 1000); // every 1 second 
+0

Sí, también encontré este gestor de colas jQuery ajax, que creo que hace básicamente lo que usted está describiendo aquí: http://www.protofunc.com/scripts/jquery/ajaxManager/ – Chris

0

Voy a tomar una puñalada en la oscuridad con este, pero que podría ayudar. Tal vez podrías crear una matriz de búfer global y luego cada vez que retorna AJAX puedes agregar el resultado al búfer. Luego puede configurar un temporizador que, cuando se active, verificará el contenido del búfer. Si están en orden, lo emitirá en consecuencia.

8

Bueno, los resultados pueden regresar en cualquier orden indefinido, son asincrónicos y están sujetos a los caprichos de internet y servidores.

Lo que puede hacer es tratar el problema de la misma forma que TCP lo hace a través de UDP. Usas identificadores de secuencia.

Mantenga en marcha un identificador de secuencia e increméntelo cada vez que envíe una solicitud. A medida que vuelvan las solicitudes, márquelas en orden y solo trátelas a medida que ingresen. Mantenga una lista de lo que ha regresado con los datos en orden y haga un encendido de rutina para verificar esa lista después de cada actualización. Cuando llegue el primer esperado, debe procesar toda la lista hasta el primer espacio.

Ten en cuenta que podrías perder una solicitud, por lo que un tiempo de espera adecuado antes de ignorar un identificador de secuencia determinado estaría en orden.

Cuestiones relacionadas