[JS] Probleem met XmlHttpRequest in een loop

Pagina: 1
Acties:

  • Chevalric
  • Registratie: November 2000
  • Laatst online: 30-04 17:51
Ik ben voor m'n werk bezig om een kalender te maken. De kalender wordt gevuld met gegevens uit een database die ik via een XmlHttpRequest object met Javascript ophaal. Op zich gaat dit allemaal zonder problemen.
Ik moet nu echter gegevens van verschillende urls ophalen, maar dat wil maar niet lukken. Zodra ik de code in een loop gooi, krijg ik alleen de resultaten van de laatste url. De code ziet er (vereenvoudigd) als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
aUrls = new Array("url1", "url2");
xmlhttp = false;        
xmlhttp = createXMLHTTP();      

for (var x = 0; x < aUrls.length; x++) {
  if (xmlhttp) {
    xmlhttp.open("POST", aUrls[x], true);   
    xmlhttp.onreadystatechange = handleStateChange;
    xmlhttp.send(null);
  }
}


handleStateChange is een functie waarin ik de xml parse en verder verwerk.
met createXMLHTTP maak ik een XmlHttpRequest object aan, afhankelijk van de browser.

Ik heb zelf het vermoeden dat de oorzaak ligt bij het feit dat ik constant hetzelfde object gebruik, waardoor de opgehaalde XML van de eerste url niet verwerkt kan worden, voordat de XML van url 2 geladen wordt. Ik heb echter geen idee hoe ik dit kan oplossen. Weet iemand van jullie misschien een goede oplossing?

Xbox Live: Chevalric


  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

Misschien ben je per url een object nodig, of moet je tussendoor een xmlhttp.close() doen. En als je van die true een false maakt?

[ Voor 19% gewijzigd door André op 24-12-2004 14:22 ]


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Je hebt 1 xmlhttp object, en die staat op asynchroon (die true in open()). dat houdt dus in dat de for loop niet wacht op het laden van de data, en de volgende open() al aangeroepen wordt voordat degene daarvoor afgehandeld is. Dan krijg je idd dus alleen de laatste binnen.

als je het synchroon doet kan je meteen na de send(null) de xmlhttp.responseXML opvragen. Of je zal idd aparte xmlhttp's moeten gebruiken (of alle data in 1 request ophalen zonder for).

[ Voor 27% gewijzigd door Clay op 24-12-2004 15:20 ]

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Clay schreef op vrijdag 24 december 2004 @ 15:06:
Je hebt 1 xmlhttp object, en die staat op asynchroon (die true in open()). dat houdt dus in dat de for loop niet wacht op het laden van de data, en de volgende open() al aangeroepen wordt voordat degene daarvoor afgehandeld is. Dan krijg je idd dus alleen de laatste binnen.
Hetgeen dus betekent dat je ofwel de boel synchroon moet laden (makkelijk), of je maakt een "stack" met URLs, waarvan je er in "handleStateChange" - nadat je de geladen XML verwerkt hebt) er steeds 1tje afpakt en weer voert aan je functie die een nieuwe XML inlaadt (wat lastiger). Of je maakt voor elke URL een nieuw XML object aan maar dat is niet zo netjes vind ik..

--e--

Het asynchrone "stack" verhaal is in jouw situatie bij nader inzien een beetje overcomplex. Ik heb het ooit gebruikt in een single-page-UI waar het moment waarop en aantal verschillende XML bronnen dat ingeladen en verwerkt moest worden geheel variabel was, en dan werkt zo'n contsructie heel handig...

[ Voor 19% gewijzigd door Genoil op 24-12-2004 15:29 ]