2012-07-24 15 views
5

Nella mia applicazione Web, ho una serie di chiamate Ajax che vengono attivate rapidamente. Sul server, questi devono essere elaborati nello stesso ordine in cui vengono inviati dal client.jQuery chiamate ajax sincroni non bloccanti

Ho usato la configurazione async: false in jQuery per farlo. Tuttavia questo fa sì che la GUI diventi molto pigra mentre blocca il completamento delle chiamate. Con async: true la GUI è reattiva, ma le richieste non vengono sempre elaborate in ordine.

Esiste un non-blocking modo alternativo di coda richieste Ajax, in modo che il prossimo viene inviato solo dopo che quello precedente ha finito?

NOTA: non ho un "elenco" di richieste da elaborare. Le richieste vengono generate al volo, quindi devo essere in grado di inserirle in una sorta di coda FIFO quando vengono generate, quindi consumare la coda con qualche processo.

+1

è possibile chiamare ognuno quando il precedente è terminato. – ocanal

risposta

6

Esso può essere fatto facilmente 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

Penso che 'done' possa avere argomenti' .done (function (a1, a2) {...}) ' –

+1

@Sheikh Heera: sì, ma non riesco a capire come sia possibile farlo per tutti i differiti (nel caso se li incateniamo, non corriamo simultaneamente). Se solo passiamo manualmente 'arguments' in' secondAjax' – zerkms

+1

OK, il problema è che non "ho" tutte le chiamate che sto per fare quando inizia questo processo ... – bradvido

Problemi correlati