Autor | Zpráva | ||
---|---|---|---|
kajaman Profil |
#1 · Zasláno: 2. 1. 2009, 11:54:39 · Upravil/a: kajaman
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 |
#2 · Zasláno: 2. 1. 2009, 12:34:41 · Upravil/a: Leo
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 |
#3 · Zasláno: 2. 1. 2009, 14:47:29 · Upravil/a: kajaman
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 |
#4 · Zasláno: 2. 1. 2009, 15:57:20
:-( kde jsou všichni JS guruové?
|
||
ah01 Profil |
#5 · Zasláno: 2. 1. 2009, 16:12:32
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 |
#6 · Zasláno: 2. 1. 2009, 19:29:31
ah01
v jednom vláknu... úplně jasné, děkuji. |
||
Časová prodleva: 15 let
|
0