Asynchronicity, Recursion and Resignation

Heute mal ein etwas spannenderes Thema!

Ich sollte Google Maps für einen Klienten anbinden, eine Karte die 2 Dutzend Standorte eingetragen hat.
In der Datenbank befinden sich nur die Adressen, aber nicht die Koordinaten der Standpunkte.
Ich habe dann eine Funktion von einem Kollegen bekommen, der das Problem schon im Sommer in Angriff genommen hat und dessen Methoden ich nur anpassen musste.
Allerdings stellte sich heraus, dass die Funktion fehlerhaft war und für alle 24 Standorte die selben Informationen dargestellt hat.

Das war verwunderlich, aber nach einigem Hin und Her konnte ich rausfinden, dass der Google.Maps Geocoder asynchron arbeitet (Diese Klasse wandelt einfach gesagt, Addressen in Koordinaten um).
D.h. er sendet die Aufträge die Daten abzurufen, der JavaScript Code wird aber schon weiter ausgeführt bevor die abgerufenen Daten angekommen sind.
Am Ende wurden dann alle Markierungen mit dem Daten des letzten erhaltenen Eintrags gefüllt.
Danach habe ich versucht die Methodik des Abrufens auszulagern.
Auch das hat nicht wirklich funktioniert, da die ausgelagerte Methode das Arra zurückgegeben hat bevor es gefüllt war. –> Keine Daten.

Dann kam mir ein Geistesblitz und ich entschied mich für einen Rekursiven Selbstaufruf in dem die Methodik nach dem Selbstaufruf durchgeführt wurde.
So konnte ich sicherstellen, dass die Daten alle individuell ihren Markierungspunkten zugewiesen wurden.
Außerdem konnte ich so vermeiden einen Callback zu verwenden, mir erscheint das nämlich wie Voodoo. Sowieso finde ich die herangehensweise Funktionen unausgeführt als Strings zu übergeben sehr befremdlich. Aber gut, JavaScript hat nun mal wenig mit Java zu tun.

Auf jeden Fall stellte ich fest, dass auch diese Herangehensweise nicht dass gewünschte Ergebnis liefert.
Da ich mir aber ziemlich sicher war, dass der Fehler nicht im Code liegt begann ich mir den Geocoder näher anzusehen, da ich den Verdachte hatte, dass dieser die Aufrufe nicht schnell genug verarbeiten konnte.
Stellte sicher als wahr heraus, als nächstes also ein delay() implementieren um zu schauen ob das dem Problem Abhilfe verschafft (heißt natürlich nich delay, sondern bei JavaScript setTimeout und funktioniert etwas anders).

Tat es auch, allerdings musste ich den break so hochstellen, dass die Verarbeitungszeit auf 10 Sekunden anstieg. Und mal im Ernst, jeden User 10 Sekunden warten zu lassen bis er die Karte sehen kann?

Also alles rausschmeißen, dann im Backend einen Bereich anlegen, wo der Nutzer die Geokoordinaten (Latitude und Longitude) von jedem Standort per Hand einträgt und diese aus der Datenbank abgerufen werden.

Jetzt fragt ihr euch wahrscheinlich warum ich den Geocoder nicht im Backend implementiert habe und die Werte nur einmal für jeden neuen Store ausgelesen habe um die Koordinaten automatisch in die Datenbank zu schreiben!
(War nur nen Spass, ich weiß dass selbst die Informatiker die das hier lesen, wahrscheinlich nur mit müdem Auge den Text überflogen haben und nicht über bessere Lösungsansätze gegrübelt haben).

Naja, das war auf jeden Fall meine nächste Idee, aber da ich die Zeit für diesen Task schon dermaßen überzogen hatte, wurde mir davon abgeraten.
Falls ich aber nochmal Zeit auf Arbeit finde, baue ich das nochmal um (Auch wenn das Herumfrickeln im WordPress Backend immer wieder ne Qual für mich ist).

Das Ergebnis ist, dass ich mich einen ganzen Tag lang mit Asynchronität und JQuery herumgeschlagen habe, um am Ende alles wieder rauszuschmeißen und doch die Holzhammer Methode anzuwenden.
Das is bitter, aber wenigstens hab ich dabei einiges gelernt.

Und das Fazit ist:
„Manchmal ist die beste Lösung halt auch nicht die Richtige“.

Euer Autor

Advertisements

Über Ludo

Just another dude
Dieser Beitrag wurde unter Das Praktikum veröffentlicht. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu Asynchronicity, Recursion and Resignation

  1. Ludo schreibt:

    Ja und wenn man am nächsten Tag auf Arbeit ist und seinem Kollegen zeigen will, dass man es zum Laufen gebracht hat, geht es natürlich nicht.

    Hab jetzt die Rekursion wieder eingebaut und es geht endlich, ohne Zeitverzögerung.
    Soo much win!

  2. dirk schreibt:

    Beim Brainstorming-Meeting kamen wir zur Conclusion, die Reception mancher Claims mal zu researchen… 🙂

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s