Primero tengo que admitir que soy relativamente nuevo en JavaScript, pero recientemente encontré el mismo problema al usar la función jQuery ajax. Tuve que subir un par de documentos a través de POST a un servidor en un cierto orden. Anidar todas las devoluciones de llamada habría producido un código completamente desordenado. Pensé en una solución después de leer las respuestas y encontré una solución que me funcionó bien. Utiliza una única función con una cláusula de cambio a diferenciar las distintas invocaciones de devolución de llamada:
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;
}
});
Si esto no es una buena idea, por favor hágamelo saber. Como dije, no soy un experto en JavaScript, pero funcionó bastante bien para mí.
mejor, René
Editar:
Después de un tiempo descubrí que Promises son un enfoque mucho mejor para resolver este problema.
Aunque ese enfoque requiere mucho más esfuerzo, es seguro y muy bueno :) Pero en realidad no es una cuestión de "programación funcional". – selfawaresoup
Esto se ve muy bien, pero no puedo entender cómo funciona la clase diferida internamente. –
Un vistazo a la fuente de jsdeferred (http://github.com/cho45/jsdeferred/blob/master/jsdeferred.js) le dice que la siguiente función simplemente espera que llegue la primera llamada ajax (usando setTimeout) y luego envía el siguiente. – fbuchinger