Prima devo ammettere, sono relativamente nuovo a JavaScript, ma recentemente ho riscontrato lo stesso problema durante l'utilizzo della funzione jQuery ajax. Ho dovuto caricare un paio di documenti tramite POST su un server in un certo ordine. Annidare tutte le richiamate avrebbe prodotto codice completamente incasinato. Ho pensato a una soluzione dopo aver letto le risposte e ho trovato una soluzione che funzionava bene. Esso utilizza una sola funzione con una clausola di interruttore per differenziare le diverse invocazioni di callback:
var callback = function(sCallIdentifier, callbackParameters){
switch(sCallIdentifier){
case "ajaxOne":
doYourStuff(callbackParameters); //do your stuff for ajaxOne
ajaxTwo(function(newCallbackParameters){
/*define a anonymous function as actual method-callback and pass the call-identifier, together with all parameters, to your defined callback function*/
callback("ajaxTwo", newCallbackParameters);
});
break;
case "ajaxTwo":
doYourStuff(callbackParameters);
ajaxThree(function(newCallbackParameters){
callback("ajaxThree", newCallbackParameters);
});
break;
case "ajaxThree":
doYourStuff();
break;
}
});
Se questa non è una buona idea, per favore fatemelo sapere. Come ho detto, non sono un esperto di JavaScript, ma ho funzionato abbastanza bene per me.
migliore, René
Edit:
Dopo un po 'ho scoperto che Promises sono un approccio molto migliore per risolvere questo problema.
Anche se questo approccio richiede molto più impegno, sicuramente è molto bello e pulito :) Ma non è davvero una questione di "programmazione funzionale". – selfawaresoup
Sembra davvero interessante, ma non riesco a capire come la classe differita funzioni internamente. –
Uno sguardo alla sorgente di jsdeferred (http://github.com/cho45/jsdeferred/blob/master/jsdeferred.js) ti dice che la prossima funzione aspetta semplicemente che arrivi la prima chiamata ajax (usando setTimeout) e poi manda il prossimo. – fbuchinger