Doppelte asynchrone Anfragen vermeiden
Temruk
- javascript
Hallo Experten!
Folgendes Szenario: ich habe zwei DIVs, davon ist DIV 1 eine sehr große Karte, DIV 2 ein Sichtfenster auf diese Karte. In diesem kann der Benutzer die Karte mit der Maus nach dem GoogleMaps-Prinzip hin und her ziehen. Vereinfacht:
<div id="karte">
<div id="sichtfenster">
Bin etwa 600 x 400 Pixel groß, die Karte unter mir 2500 x 2500 Pixel.
</div>
</div>
Sobald der Benutzer die Karte in einen Bereich zieht, der noch nicht geladen wurde (das prüfe ich Anhand der Position "karte" zu "sichtfenster"), schicke ich asynchrone Anfragen weg, lade die Daten der Karte aus der Datenbank nach und erstelle dann, sobald die Antwort vom Server da ist, per JS ein neues DIV in meiner Karte, das den Kartenteil repräsentiert (z.B. ein Waldfeld). Ob ein Kartenteil geladen ist, prüfe ich anhand des DOMs und schaue da, ob das entsprechende DIV schon vorhanden ist.
Nun kann es ja eine Weile dauern, bis die asynchrone Anfrage vom Server beantwortet wurde. Währenddessen kann der Benutzer fröhlich auf der Karte umherwandern. Um nun zu vermeiden, dass Kartenteile doppelt angefragt werden, habe ich mir ein kleines Array geschrieben, nach diesem Stile:
request = 0;
requestedTiles = [];
function dragMap() {
requestedTiles[request] = [];
// Es muss Kartenteil [2, 5] nachgeladen werden
// push() kommt aus dem Prototype-Framework
requestedTiles[request].push([2,5]);
// Hier werden die Tiles asynchron geladen und dann dargestellt
loadTiles(requestedTiles);
request++;
}
Zieht der Benutzer nun die Karte, speichere ich pro Request, welche Kartenteile nachgeladen werden sollen. Zieht der Benutzer nun nochmals die Karte schaue ich, ob zuvor in einem anderen Request dieser Kartenteil schonmal angefordert wurde und bisher die Antwort vom Server noch aussteht. Wenn ja, frage ich den Kartenteil nicht nochmals an, wenn nein, kommt der Kartenteil ins Array.
Meine Frage an euch Experten ist nun, ob meine "Lösung" (die wenigstens mal funktioniert) von hinten durch die Brust und so weiter ist und es da eine 100 Mal elegantere Lösung gibt.
Bin für jeden Denkanstoß dankbar!
Herzliche Grüße,
Temruk