Javascript draait in een loop vanwege JSON-string?
Door
Ariën
op 22-10-2017 23:00
gewijzigd op 22-10-2017 23:02
3.246 views
Ik heb hier een stukje AJAX-code die wat coordianten uit een API ophaalt, en verwerkt in Google Maps met een timertje die elke 5 seconden ververst. En zodoende heb je dus een mooie voertuigtracker... als het werkt.
Echter is het probleem dat deze in een recursieve loop draait, geeft de debugger weer, en inderdaad wordt er een hoop geheugen gebruikt.
Dus, het werkt niet. En het ligt aan de format van de JSON-string, heb ik het idee.
Als deze gewoon leeg is dan laad hij het script prima in (en uiteraard op de 0,0 locatie). Maar met onderstaande JSON-string in de request gaat hij dus voluit op zijn plaat op lijn nummer 15.
Is het probleem niet dat je zowel op de success als de done een nieuwe timer start (dus 2x). Die starten beide ook weer 2 nieuwe timers, enz. Gaat best hard.
Tevens: waarom gebruik je niet dateType: 'json', hoef je niet met parseJSON() aan de slag.
@Rob: Bij het done-event is hij ook weggecomment, omdat die daar niet werkte.
Maar als ik dataType JSON gebruik, hoe kan ik dan de data uit de JSON-string apart oproepen i.p.v. JSONparse?
Maar waarom gaat hij puur op zijn plaat op deze JSON-string dan? Dat snap ik echt niet.
Voorheen had deze techniek ook geen moeite, dus ik kan wel overstappen naar JSON als dataType, maar dat is nog geen oplossing voor dit probleem, lijkt mij.
Edit:
Hij loopt niet meer met dataType JSON. :-)
Inmiddels heb ik dit:
Als je beide setTimeouts() even weglaat? Nog steeds zelfde probleem?
En als je regel 15 t/m 19 weglaat? Nog steeds zelfde probleem? Je zit op regel 15 nl wel twee floats te concatten, misschien gaat dat mis, en triggert dat de verdere ellende (error handler ergens)?
Als je dataType: 'json' meegeeft is je returnedData meteen al JSON. Hoef je dus niks voor te doen.
De Latitude en Longitude zitten nog in een subarray subojbect van het treinnummer als de JSON-snippet uit je oorspronkelijke bericht nog steeds van toepassing is. Deze zul je dan daar uit moeten peuteren.
Hm, als ik mij niet vergis is die API-respons nogal onhandig opgezet. Immers, je vraagt iets van een specifieke trainset op. Vervolgens wordt de data teruggegeven als de waarde van een property... Waarom niet meteen de data? :/
Krijg je ooit waarden terug van meerdere trainsets? Want properties hebben geen vaste volgorde, dus je zult dan echt aan het trainset-nummer moeten refereren om de juiste data terug te krijgen :/.
Ik weet ook niet of properties de naamgeving van variabelen moeten volgen (lijkt mij van wel?), dus als dat echt letterlijk "1234" is (zal wel niet?) dan is dat technisch gezien niet eens een toegestane constructie.
Als die "1234" een soort van tekst is die voldoet aan de naamgeving van een variabele (bijvoorbeeld "blaat"), dan zou je hier aan kunnen refereren via returnedData.blaat.Longitude (dus gewoon een object syntax), maar dan moet je callback-functie wel dit nummer kennen. Je zou twee vliegen in een klap kunnen slaan door hier een parameter van te maken in je getCoords() functie, zodat deze ook meteen wat dynamischer wordt?