2012-07-24 20 views
5

En mi aplicación web, tengo una serie de llamadas ajax que se activan rápidamente. En el servidor, estos deben procesarse en el mismo orden en que se enviaron desde el cliente.jQuery llamadas sincrónicas ajax sin bloqueo

He estado usando la configuración async: false en jQuery para hacer esto. Sin embargo, esto hace que la GUI se vuelva lenta y bloquea el final de las llamadas. Con async: true, la GUI responde, pero las solicitudes no siempre se procesan en orden.

¿Existe alguna manera de sin bloqueo para poner en cola las solicitudes ajax, por lo que la siguiente se envía solo después de que la anterior haya finalizado?

NOTA: No tengo una "lista" de solicitudes para procesar. Las solicitudes se generan sobre la marcha, así que tengo que ser capaz de meterlas en una especie de cola FIFO cuando se generan, y luego consumir la cola con algún proceso.

+1

puede llamar a cada uno cuando el anterior haya terminado. – ocanal

Respuesta

6

Se puede hacer fácilmente con jQuery promises:

function firstAjax() { 
    return $.ajax({...}); 
} 

function secondAjax() { 
    return $.ajax({...}); 
} 

firstAjax().pipe(secondAjax).pipe(...).done(function() { 
    alert('all requests have successfully finished'); 
}); 

o

$.when(firstAjax()).pipe(secondAjax).pipe(...).done(function() { 
    alert('all requests have successfully finished'); 
}); 

http://jsfiddle.net/zerkms/WQcVD/1/

+0

Creo que 'done' podría tener argumentos' .done (function (a1, a2) {...}) ' –

+1

@Sheikh Heera: sí, pero no entiendo cómo es posible hacer eso para todos los diferidos (en caso de que si los encadenamos, no corremos simultáneamente). Si solo pasamos 'argumentos' manualmente en 'secondAjax' – zerkms

+1

OK, el problema es que no" tengo "todas las llamadas que voy a hacer cuando comience este proceso ... – bradvido