Najpierw muszę przyznać, jestem stosunkowo nowy w JavaScript, ale ostatnio napotkałem ten sam problem podczas korzystania z funkcji ajax jQuery. Musiałem przesłać kilka dokumentów przez POST do serwera w określonej kolejności. Zagnieżdżanie wszystkich połączeń zwrotnych spowodowałoby wygenerowanie całkowicie pomieszanego kodu. Myślałem o rozwiązaniu po przeczytaniu odpowiedzi i wymyśliłem rozwiązanie, które dobrze mi pasowało. Wykorzystuje tylko jedną funkcję z klauzulą przełącznika w celu odróżnienia różnych wywołań zwrotnych:
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;
}
});
Jeśli to nie jest dobry pomysł, proszę dać mi znać. Jak już powiedziałem, nie jestem ekspertem od JavaScript, ale mi się udało.
Best, René
Edit:
Po pewnym czasie okazało się, że Promises są o wiele lepsze podejście do rozwiązania tego problemu.
Chociaż takie podejście wymaga znacznie więcej wysiłku, to z pewnością jest bardzo ładne i czyste :) Ale tak naprawdę nie jest to kwestia "programowania funkcjonalnego". – selfawaresoup
To wygląda naprawdę fajnie, ale nie mogę zrozumieć, jak odroczona klasa działa wewnętrznie. –
Spojrzenie na źródło jsdeferred (http://github.com/cho45/jsdeferred/blob/master/jsdeferred.js) mówi, że następna funkcja po prostu czeka na pierwsze wywołanie ajax (przy użyciu setTimeout), a następnie wysyła Następny. – fbuchinger