Autor Zpráva
kajaman
Profil
Ahoj, všem! Mám trochu nejasno, jak je řízen JS kód. Začnu ukázkou:

var xmlHttp;
var vysledek = 'puvodni text';

/* vytvorim XMLHttpRequest objekt, který by měl po skončení
requestu do proměnné vysledek přiřadit text souboru server.xml
a vypsat ho alertem */

xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
	                                               if(xmlHttp.readyState == 4) {
                                                           vysledek = xmlHttp.responseText;
                                                       }
                                                  }
xmlHttp.open('GET', 'server.xml', true);
xmlHttp.send(null);

/* tímhle se snažím zdržet prohlížeč, aby měl Ajax kód
možnost se vykonat */

var a = 1;
var soucet = 0;
for(var i = 0; i < 1000000; i++){
   a++;
   soucet += a;
}

alert('Vysledek na konci skriptu: ' + vysledek);


... myslel jsem si, že vytvořím ten Ajax request a jelikož je asynchonní, tak se bude
někde v pozadí vykonávat, mezitím se na popředí bude odvíjet ten zdržovací cyklus.
Ajax request přiřadí do proměnné vysledek obsah souboru server.xml ... a stále
se vykonává zdržovací cyklus ... když skončí vypíše se alertem obsah proměnné
vysledek.

Čekal bych, že to bude obsah souboru server.xml, ale zatím je to ten "původní text".

jak to? znamená to, že ten Ajax request čeká, až se vykoná zbytek skriptu
a tudíž nestačí do proměnné vysledek přiřadit ten obsah včas?
Leo
Profil
Zdrzovaci cyklus neni potreba, "zdrzeni" se realizuje tim, ze je to asynchronni pozadavek a data co prijdou ze serveru zpracovavate az kdyz dojde k udalosti onreadystatechange s hodnotou readyState 4.

Takze ten alert musite mit v anonymni fci zavesene na onreadystatechange.

Leo
kajaman
Profil
Leo

no, to je sice určitě pravda, ale já jsem se spíš snažil vyzkoušet, jestli se ten běh jakoby rozdělí do dvou vláken, která jsou na sobě nezávislá... 1. vlákno vytvoří xmlHttp a odešla Ajax request (čímž vytvoří druhé vlákno) a jede si dál (to je ten zdržovací cyklus) a na konci vypíše proměnnou vysledek. Druhé vlákno mezitím získá data ze souboru server.xml a přiřadí je do proměnné vysledek (to by se mělo stát před dokončením zdržovacího cyklu v prvním vládku vzhledem k počtu opakování).

Takhle si to představuju, ale bohužel to tak nefunguje. Proč?
kajaman
Profil
:-( kde jsou všichni JS guruové?
ah01
Profil
kajaman
Veškerý JS se zpracovává v jednom vlákně prohlížeče. Tedy toto tvé snažení postrádá smysl. Ty pošleš asynchroní požadavek na server, a pak si jdeš počítat ten zpožďovací cyklus, po jeho skončení zobrazíš alert. Obsluha onreadystatechange se ale nedostane ke slovu, dokud tohle všechno nedoběhne. Až pak se změno vysledek podle dat ze serveru.


Mimochodem – používat jakékoliv zdržovací cyklus nebo dokonce aktivní čekání je programátorská prasárna. Zde je to jen jako příklad, takže předpokládám, že do nějakého funkčního kódu by tě nenapadlo něco takového dát.
kajaman
Profil
ah01

v jednom vláknu... úplně jasné, děkuji.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0