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.