¿Cómo hacer queue llamadas AJAX / function en jQuery ($ .Defernetworking)?

Estoy buscando poner en queue una cantidad arbitraria de llamadas a funciones posiblemente opcionales en JavaScript / jQuery. Por ejemplo, puedo necesitar asegurarme de que el usuario esté autenticado y que se haya configurado una cookie antes de ejecutar una segunda function (o tercera, cuarta, etc.) o una llamada AJAX.

Intenté hacer esto con el jQuery.Defernetworking recientemente agregado, pero descubrí que no importa en qué order se activen las llamadas (estilo asíncrono verdadero). Además, leí que una vez que se resolvió una instancia diferida, no es posible resolverla.

Aquí es donde estoy con esto en este momento. Inicialmente, estaba pensando en resolver la instancia Defernetworking para resolverla y luego resolverla si surgía una function opcional en la stack.

var d = $.Defernetworking(), chained = d, d.resolve(), div = extra.find( "div:first" ); if ( extra.attr( "requires-auth" ) != undefined && !config.user_is_authenticated ) chained = chained.pipe( authenticate ); if ( div.length ) chained = chained.pipe( prepareExtra( div ) ); // When the two optional methods are resolved, show the content chained.done( function() { extra.fadeIn( 500 ) } ); 

Mi pregunta es, ¿cuál es la mejor manera de hacer queue (de 0 a N) llamadas AJAX en JavaScript / jQuery puro? (sin usar complementos)

Tak!

Edit 2: ¡SOLUCIONADO! Aquí hay algunos ejemplos prácticos de esto, uno sin AJAX y uno con: https://gist.github.com/1021429 https://gist.github.com/1021435

Intenta resolver tu demora inicial como la última cosa:

 var d = $.Defernetworking(), chained = d; // optionally chain callbacks with chained = chained.pipe if (condition) { chained = chained.pipe(function () { return $.ajax({...}); // Must return a new Promise }); } chained.done(function () { // all chains should be processed now }); d.resolve(); // finally, resolve the initial Defernetworking 

Usa un asistente de secuencia:

https://github.com/michiel/asynchelper-js/blob/master/lib/sequencer.js

Tuve un problema similar: jQuery Ajax / .each callback, el siguiente 'cada' disparo antes de ajax completado

He manejado esto en el pasado al tener una llamada ajax devolver los otros scripts. Para mí, esa es la mejor solución.

Sin embargo, querías un enfoque de js puro, así que daré una oportunidad.

 var ScriptQueue = { scripts: [], readyToProcess: false, timer: null, stopTimer: function() { clearTimeout(ScriptQueue.timer); ScriptQueue.timer = null; }, queue: function(functionToQueue) { ScriptQueue.stopTimer(); ScriptQueue.scripts.push(functionToQueue); ScriptQueue.processNext(); }, processNext: function() { if (!readyToProcess || ScriptQueue.scripts.length == 0) { ScriptQueue.timer = setTimeout(ScriptQueue.processNext, 30000); // try again in 30 sec } else { ScriptQueue.stopTimer(); var _function = ScriptQueue.scripts.shift(); _function.call(); ScriptQueue.processNext(); } } } $(function(){ // queue some stuff $('a').each(function() { ScriptQueue.queue(function() { console.info("running some link action"); } ); }); // authorization $.ajax({ url: yourURL success: function(data) { if (data == "correct response") { ScriptQueue.readyToProcess = true; ScriptQueue.processNext(); } } }) }); 

No tengo idea si esto funciona (no probado), pero quería sugerir una posible alternativa a la solución Defernetworking (que parece prometedora). Tal vez conduzca a un debate mayor y tal vez ignorado.

No probado, pero jQuery.when debería funcionar muy bien para esto:

 var q = []; function queue(promise, callback) { var ready = $.when.apply($, q); // resolves when all current elements // of the queue have resolved q.push(promise); ready.done(function() { q.shift(); var arg = Array.prototype.pop.call(arguments); callback.call(promise, arg); }); }