Autor | Zpráva | ||
---|---|---|---|
AM_ Profil |
#1 · Zasláno: 10. 8. 2009, 10:18:44
Zdravím,
mám stránku s AJAX skriptem, na které se může teoreticky stát, že bude vyslán další AJAX požadavek, ještě než bude předchozí dokončen, tudíž je potřeba zachovávat všechny aktivní instance (zachovávám v globálním poli saveRequests). Napsal jsem to takto, ale nevím, jestli je to úplně dobře - mohl by někdo znalý zhodnotit? Vím, mohl bych si to otestovat sám, ale: 1) nevím, jak nasimulovat případ mnoha otevřených spojení najednou (v praxi k němu ale na pomalém serveru teoreticky může dojít a kód s tím musí počítat) 2) nikdy jsem to nedělal, takže ikdyby to šlapalo, nevím, jestli to řeším optimálně function pripoj(){ if (window.ActiveXObject) { var httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } else { var httpRequest = new XMLHttpRequest(); } httpRequest.open("GET", './ypracuj.php', true); httpRequest.onreadystatechange= function () { saveResponse(httpRequest); } ; httpRequest.send(null); saveRequests.push(httpRequest); //saveRequests je globalni promenna Array } function saveResponse(httpRequest){ if (httpRequest.readyState==4){ //kod zpracovani saveRequests.splice(saveRequests.indexOf(httpRequest), 1); } } předem díky. |
||
_es Profil |
#2 · Zasláno: 10. 8. 2009, 10:52:46
AM_
Nie je to pole saveRequests nadbytočné? V 12 riadku je vytváraná vnorená funkcia, takže premenná httpRequest by mala byť dostupná priamo bez predávania ako argument. Nemám s tým skúsenosti, takže to možno nebude dobrá rada, či ten objekt nebude nejako "samozanikať", no nedalo by sa to takto: function pripoj(){ if (window.ActiveXObject) { var httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } else { var httpRequest = new XMLHttpRequest(); } httpRequest.open("GET", './ypracuj.php', true); httpRequest.onreadystatechange= saveResponse; httpRequest.send(null); function saveResponse(){ if (httpRequest.readyState==4){ //kod zpracovani } } } |
||
AM_ Profil |
#3 · Zasláno: 10. 8. 2009, 13:48:28
aha, máš pravdu, dělal jsem ten ajax podle nějakého špatného návodu, teď po tvojí radě jsem našel člának na vrana.cz, kde to mají také takto, ani není potřeba, aby ta obslužná funkce byla vnořená. Tomu by se snad dalo věřit, že to bude fungovat :)
každopádně díky - vyřešeno. |
||
_es Profil |
#4 · Zasláno: 10. 8. 2009, 14:05:59
AM_
Bez vnorenej funkcie to asi nepôjde, tá vnorená funkcia bude tam asi len definovaná iným spôsobom. |
||
Bronzi Profil |
#5 · Zasláno: 10. 8. 2009, 17:18:34
Tak jak to máš napsané tak to bude fungovat. I když vyhodíš to globální pole saveRequests, které tam je úplně zbytečné. Jinak testovat to můžeš tak že do obslužného skritpu dáš funkci sleep, která pozastaví vykonávání skriptu a tím pozdrží odpověď.
|
||
AM_ Profil |
#6 · Zasláno: 10. 8. 2009, 19:09:03
_es
„Bez vnorenej funkcie to asi nepôjde, tá vnorená funkcia bude tam asi len definovaná iným spôsobom.“ mě připadá, že ne. Posuď sám Bronzi saveRequest už jsem vyhodil jak radil _es, s tím sleepem to mě nenapadlo, díky ;) |
||
_es Profil |
#7 · Zasláno: 10. 8. 2009, 19:20:20
AM_
„mě připadá, že ne.“ Vzniká tam vnorená funkcia: xmlhttp.onreadystatechange = function () { state_change(xmlhttp); }; Tento príkaz je v definícii funkcie send_xmlhttprequest, takže do xmlhttp.onreadystatechange je priradená vnorená funkcia. A tá môže pristupovať ku všetkým premenným definovaným v send_xmlhttprequest aj ku všetkým argumentom tej funkcie. Využíva však len jednu premennú - xmlhttp. |
||
AM_ Profil |
#8 · Zasláno: 10. 8. 2009, 20:06:27
_es
aha, děkuji za vysvětlení :) javascriptový objektový model není úplně moje parketa |
||
Časová prodleva: 15 let
|
0