Autor Zpráva
AM_
Profil
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
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
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
AM_
Bez vnorenej funkcie to asi nepôjde, tá vnorená funkcia bude tam asi len definovaná iným spôsobom.
Bronzi
Profil
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
_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
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
_es
aha, děkuji za vysvětlení :) javascriptový objektový model není úplně moje parketa

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: