ajax + schleife
andi
- javascript
Hallo!
ich möchte die in jede spalte einer tabelle (1 zeile) etwas aus einer datbank anzeigen lassen, das mittels ajax nachgeladen wird.
das ganze funktionier so:
In einem javascript läuft eine for-schleife, die nach und nach eine funktion aufruft, welche die daten aus der datenbank holt und in die tabelle schreibt.
das problem:
1. durchlauf der for-schleife: die funktion wird gestartet
2. durchlauf der for-schleife: die funktion wird gestartet, und der erste aufruf abgebrochen
x. durchlauf der for... : jeweils die zuvor aufgerufene funktion wird abgerochen. und das ergebnis der funktion X (die letzte) wird in der tabelle ausgegeben.
ich verwende folgenden code (übersicht)
var xmlHttp
funktion ich_werde_aus_html_aufgerufen
{
xmlHttp=GetXmlHttpObject()
for(i=0; i<anz; i++)
{
_ich_hole_daten_aus_db(parameter);
}
}
function ich_hole_daten_aus_db(parameter)
{
xmlHttp.onreadystatechange=function(){stateChanged(i);};
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged(i)
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById(tabellenspalte).innerHTML=xmlHttp.responseText
}
}
function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
{
objXMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}
return objXMLHttp
}
ich hoffe das ist übersichtlich....
und danke für eure antworten!
hi,
ich möchte die in jede spalte einer tabelle (1 zeile) etwas aus einer datbank anzeigen lassen, das mittels ajax nachgeladen wird.
das ganze funktionier so:
In einem javascript läuft eine for-schleife, die nach und nach eine funktion aufruft, welche die daten aus der datenbank holt und in die tabelle schreibt.
Das klingt suboptimal.
Warum willst du so viele Requests absetzen - geht es denn nicht mit einem, der alle Daten holt - und die dann clientseitig per Script auf die einzelnen Tabellenzellen verteilt werden?
gruß,
wahsaga
würde schon gehen, aber gewünscht ist es anders. ich versteh das nicht, warum die schleife nicht einfach auf die funktion warten kann..
hi,
würde schon gehen, aber gewünscht ist es anders.
Mit welcher Begründung?
gruß,
wahsaga
damit sich die seite nach und nach aufbaut und man nicht denkt, das die seite nicht mehr weitermacht...
In einem javascript läuft eine for-schleife, die nach und nach eine funktion aufruft, welche die daten aus der datenbank holt und in die tabelle schreibt.
Nach und nach dürfte dein Problem sein, es gibt keine nach und nach sondern die Schleife wird durchlaufen und alle Funktionen werden quasi unmittelbar aufgerufen.
ich verwende folgenden code (übersicht)
var xmlHttp
funktion ich_werde_aus_html_aufgerufen
{
xmlHttp=GetXmlHttpObject()for(i=0; i<anz; i++)
{
_ich_hole_daten_aus_db(parameter);
}
}
Das geht so nicht. AJAX heißt asynchron, d.h. du rufst die Funktion anz-mal auf und dabei wird jedesmal die ganze Aufruffunktion überschrieben.
xmlHttp.onreadystatechange=function(){stateChanged(i);};
globale Schleifenvariabelnb sind schon sehr unsauberer Stil und diese dann in einer Unterfunktion verwenden ist die Krönung. Wer sowas macht "frißt auch kleine Kinder" ;-) - du baust dir damit selber Fallen in die du früher oder später reintreten wirst und nur schwer rauskommst.
Es gibt zwei Möglichkeiten dein Problem zu lösen, entweder du erzeugst in jedem Schelifen druchlauf ein neues XMLHHTP Objekt oder du wartest ab bis das Ergebnis kommt und löst dann die nächste Abfrage aus.
Struppi.
Es gibt zwei Möglichkeiten dein Problem zu lösen, entweder du erzeugst in jedem Schelifen druchlauf ein neues XMLHHTP Objekt oder du wartest ab bis das Ergebnis kommt und löst dann die nächste Abfrage aus.
das ist ja mein problem, wie sag ich "warte bis das ergebnis kommt" ?
hi,
das ist ja mein problem, wie sag ich "warte bis das ergebnis kommt" ?
Entweder, in dem du den nächsten Request erst aus der onreadystatechange-Behandlung des aktuellen auslöst - oder, in dem du von asynchron auf synchron umstellst (generell wenig bis gar nicht zu empfehlen, kann u.U. die komplette Seite lahmlegen, wenn ein Request abschmiert).
gruß,
wahsaga