kolejność zdarzeń

1

Witam,
mam taki oto kod:

function start()
{
 for(x=0;x<5;x++)
 {
  //cos tutaj sobie licze
  show(x); 
 }
}

function show(x)
{
 var myAjax = new Ajax.Request("function.php",{method: 'get', parameters: x, onComplete: show2});
 //tutaj wysyłam dane przy pomocy Ajax'a na serwer a później po zakończeniu wykonywania skryptu uruchamiana jest funkcja show2()
}
function show2(tekstodajaxa)
{
 //tutaj jeszcze obrabia tekst z Ajax'a i dodaje go na stronie
}

 

W momencie kiedy uruchamiana jest (w pętli) funkcja show() pętla nie czeka na to, że uruchamiana jest też funkcja show2.Wykona tylko funkcje show i leci dalej. W jaki sposób wymusić aby funkcja show() zatrzymała pętlę na czas pełnego wykonania jej ? czyli ma się wykonać show() i show2

0

Jak dla mnie ajax jest asynchroniczny wiec on sobie leci i nie czeka i zwraca coś tam później.
Zrób synchroniczny ajax to bedzie blokował ja.

1

Wielkie dzięki!
Uruchomiłem polecenie Ajax'a synchronicznie

 
var myAjax = new Ajax.Request("function.php",{method: 'get', parameters: x,asynchronous:false, onComplete: show2})

i wszystko działa :)

2

Niestety, tak nie należy robić w zdecydowanej większości praktycznych przypadków. Użycie synchronicznego Ajaxa, czy w ogóle jakiegokolwiek kodu, blokuje całkowicie wątek interfejsu i JavaScriptu przeglądarki. Innymi słowy, w przypadku Ajaxa, po wysłaniu żądania cała przeglądarka (a przynajmniej bieżąca karta -- w wypadku Chrome'a) jest zamrażana i nie odpowiada aż do momentu nadejścia odpowiedzi.

Gdy testujesz to u siebie na localhoście czy nawet na LAN-ie to może działać OK, bo serwer bardzo szybko odpowiada. W praktyce jednak, w Internecie, opóźnienia dochodzą do kilku sekund. Zwykle nie można sobie pozwolić na całkowite zmulenie przeglądarki na tak długi czas. Zwróć proszę na to uwagę i przetestuj sprawę jeszcze raz.

Tak normalnie to należałoby to zrobić asynchronicznie, ale kod byłby tu już nieco bardziej skomplikowany niż jedna pętla for. Działałoby to tak, że start() wykonywałoby tylko jedno żądanie. W funkcji show2() (pewnie zmienilibyśmy jej nazwę na bardziej adekwatną) wykonywana byłaby najpierw normalna akcja obrabiania odpowiedzi ajaxowej, a następnie wykonywane byłoby kolejne żądanie (aż do piątego).

1 użytkowników online, w tym zalogowanych: 0, gości: 1