jQuery Deferred – aguardando várias solicitações AJAX para concluir

Eu tenho uma cadeia profunda de três camadas de chamadas ajax diferidas, e idealmente elas vão chutar a promise todo o caminho até quando a camada mais profunda terminar (me faz coisa de Inception … “nós precisamos ir mais fundo!”).

O problema é que estou enviando muitas requisições ajax (possivelmente centenas) de uma só vez e preciso adiar até que todas estejam concluídas. Eu não posso confiar no último sendo feito por último.

function updateAllNotes() { return $.Deferred(function(dfd_uan) { getcount = 0; getreturn = 0; for (i = 0; i <= index.data.length - 1; i++) { getcount++; $.when(getNote(index.data[i].key)).done(function() { // getNote is another deferred getreturn++ }); }; // need help here // when getreturn == getcount, dfd_uan.resolve() }).promise(); }; 

    Você pode usar .apply() e .apply() com vários diferidos. Extremamente útil:

     function updateAllNotes() { var getarray = [], i, len; for (i = 0, len = data.length; i < len; i += 1) { getarray.push(getNote(data[i].key)); }; $.when.apply($, getarray).done(function() { // do things that need to wait until ALL gets are done }); } 

    Se você se referir a jQuery.When doc, se uma de suas chamadas ajax falhar, o retorno de chamada principal de fail será chamado mesmo que todas as chamadas ajax seguintes não tenham sido concluídas ainda. Nesse caso, você não tem certeza de que todas as suas chamadas foram concluídas.

    Se você quiser esperar por todas as suas chamadas, não importa qual seja o resultado, você deve usar outro Adiado assim:

     $.when.apply($, $.map(data, function(i) { var dfd = $.Deferred(); // you can add .done and .fail if you want to keep track of each results individualy getNote(i.key).always(function() { dfd.resolve(); }); return dfd.promise(); }); 

    Obrigado pela resposta brittohalloran. Eu também estou usando o Underscore, então eu pude aplicar sua solução muito bem com o mapa, mais ou menos assim:

     $.when.apply($, _.map(data, function(i) { return getNote(i.key); })).done(function() { alert('Be Happy'); }); 

    Mau útil.