Varias llamadas ajax desde la matriz y manejar la callback cuando se completa

He usado promesas en jQuery un poco antes, pero tengo problemas para aplicarlo en este escenario. Prefiero usar los métodos $ .when () y $ .done () para lograr esto.

Por lo que entiendo, necesito crear un objeto $ .Deferred que registre las solicitudes y cuando esas solicitudes finalicen, active la callback. En mi código de abajo, la callback se dispara antes de las solicitudes de ajax y no después, tal vez solo necesito dormir

Sé que mi código está incompleto. He estado luchando para aplicarlo con la adición del bucle for.

http://jsfiddle.net/whiteb0x/MBZEu/

var list = ['obj1', 'obj2', 'obj3', 'obj4', 'obj5']; var callback = function() { alert("done"); }; var requests = []; var ajaxFunction = function(obj, successCallback, errorCallback) { for(i = 0; i < list.length; i++) { $.ajax({ url: 'url', success: function() { requests.push(this); } }); } }; $.when($.ajax(), ajaxFunction).then(function(results){callback()}); 

Los argumentos para $.when deben ser el valor de retorno de $.ajax , que tampoco necesita ser llamado por separado, eso no tiene sentido. Quieres algo como esto:

 for (i = 0; i < list.length; i++) { requests.push($.ajax(...)); } $.when.apply(undefined, requests).then(...) 

La razón por la que se necesita .apply es porque $.when puede tomar múltiples argumentos, pero no una serie de argumentos. .apply expande esencialmente a:

 $.when(requests[0], requests[1], ...) 

Esto también supone que las solicitudes se pueden completar en cualquier orden.

http://jsfiddle.net/MBZEu/4/ - observe que 'hecho' se registra en la consola después de todos los mensajes de éxito.

Comparto un ejemplo fácil que podría ayudarlo a manejar múltiples solicitudes y sus respuestas:

 var arr = [ $.ajax({url:"test1.php"}), $.ajax({url:"test2.php"}), $.ajax({url:"test3.php"}) ]; $.when.apply( undefined, arr ).then(function() { var objects=arguments; console.dir(objects); });