ok, allora ti propongo uno script che ho abbozzato in un quarto d'ora (richiede jQuery 1.7)

ho preparato 3 file php che ritornano un output dopo un certo tempo d'attesa

script1.php
codice:
<?php sleep(4); header("Content-type: text/html"); ?>
questo è script1
script2.php
codice:
<?php sleep(2); header("Content-type: text/html"); ?>
questo è script2
script3.php
codice:
<?php sleep(6); header("Content-type: text/html"); ?>
questo è script3
(l'ordine di ritorno sarà script2, script1 e poi script3)
il codice javascript che viene eseguito al domready è il seguente:

codice:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"> </script>
<script>
$(function() {
   var defer    = $.Deferred(),
       chain    = defer,

       input    = ["script1.php", "script2.php", "script3.php"],
       output   = [];

    $.map(input, function(url, i) {
            console.log("%d Ajax request: %s", i, url);
            chain = chain.pipe(function() {
                  return $.get(url).done(function(o) {
                       output[i] = o;
                  })
            });
    });

    chain.done(function() {  console.log(output)  });
    defer.resolve();
});
se conosci i deferred objects nella pratica non faccio altro che concatenare una serie di pipe() ad un master deferred ciascuna delle quali ritorna una promise (tutti i metodi relativi ad ajax ritornano sempre una promessa) e quando ciascuna promise viene risolta salvo l'output in un array ordinato

Usa un webserver locale e attiva una console javascript per vedere l'ordine delle varie risposte e l'array ordinato di output

come puoi notare con questo codice le chiamate ajax sono sequenziali ovvero il risultato ritorna dopo 4 + 2 + 6 = 12s

se vuoi quella che ti posto qui sotto è la stessa versione con la notevole differenza che le chiamate ajax sono eseguite in parallelo ma mette in chain solo le singole promesse

codice:
$(function() {
   var defer    = $.Deferred()
       chain    = defer,

       input    = ["script1.php", "script2.php", "script3.php"],
       output   = [];

    $.map(input, function(url, i) {
            console.log("%d Ajax request: %s", i, url);
            var ajaxcall = $.get(url);
            chain = chain.pipe(function() {
                return ajaxcall.done(function(o) {
                    output[i] = o;
                })
            });
    });

    chain.done(function() {  console.log(output)  });
    defer.resolve();
});
questo codice stampa l'output dopo la chiamata ajax più "costosa" (ovvero dopo 6 secondi) per cui è più efficiente rispetto alla prima versione

Nota che manca del tutto la gestione degli errori, per cui devi valutare come si deve comportare lo script nel caso in cui una o più risorse ajax non siano disponibili.