login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Waarom werkt de for-loop niet zoals verwacht?

Offline ErickK - 29/10/2014 16:42 (laatste wijziging 29/10/2014 16:45)
Avatar van ErickKNieuw lid Beste lezers,

ik begin net met het programmeren en dacht het al iets onder de knie te hebben. Ik had een functie dat met twee parameters een andere functie aanriep en de 2e functie gaf een array van waarden terug. Omdat dit niet werkte zoals ik had verwacht, heb ik de twee functies samengevoegd en nu zit ik met een probleem dat de for-loop niet werkt zoals ik verwacht.
Een stukje van de functie ziet er als volgt uit:

  1. function haalGegevensUitDatabase()
  2. {
  3. db.transaction(function (tx)
  4. {
  5. tx.executeSql(selectAllStatement, [], function (tx, result)
  6. {
  7. dataset = result.rows;
  8. for (var i = 0, item=null; i < dataset.length; i++)
  9. {
  10. alert(i);
  11. items = dataset.item(i);
  12. var latitudeTeZoeken=items['latitude'];
  13. var longitudeTeZoeken=items['longitude'];
  14. var latlng = new google.maps.LatLng(latitudeTeZoeken, longitudeTeZoeken);
  15. var onderdelen;
  16. var admin_area;
  17. var land;
  18. var postcode;
  19. var plaats;
  20. //plaatsMarker(latlng);
  21. //alert("zit in de functie zoekgegevens2 "+ latitudeTeZoeken +" "+ longitudeTeZoeken);
  22. geocoder.geocode({'latLng': latlng}, function(results, status)
  23. {
  24. //alert("ik zit in zoekGegevens3");
  25. if (status == google.maps.GeocoderStatus.OK)
  26. {
  27. //alert("ik zit in zoekGegevens4");
  28. if (results[0])
  29. {
  30. //alert("ik zit in zoekGegevens5");
  31. onderdelen=results[0].address_components;
  32. for (var onderdeel=0; onderdeel<(onderdelen.length); onderdeel++)
  33. {
  34. if (onderdelen[onderdeel].types[0]=="administrative_area_level_1")
  35. {
  36. admin_area=onderdelen[onderdeel].long_name;
  37. }
  38. if (onderdelen[onderdeel].types[0]=="country")
  39. {
  40. land=onderdelen[onderdeel].long_name;
  41. }
  42. if (onderdelen[onderdeel].types[0]=="postal_code")
  43. {
  44. postcode=onderdelen[onderdeel].long_name;
  45. }
  46. if (onderdelen[onderdeel].types[0]=="locality")
  47. {
  48. plaats=onderdelen[onderdeel].long_name;
  49. }
  50. //alert("testing");
  51. }
  52. //alert ("ik zit in Zoekgegevens2 deel 1 "+ admin_area + land + postcode + plaats);
  53. //console.log("index"+ items['indexs'] + ' , ' + items['RcR']+ ' , ' + items['datum'] + ' , ' + items['tijd'] + ' , ' + items['valid']+ ' , ' + items['latitude']+ ' , ' + items['n_s']+ ' , ' + items['longitude']+ ' , ' + items['e_w']+ ' , ' + items['height']+ ' , ' + items['speed']+ ' , ' + items['heading']+ ' , ' + items['pdop']+ ' , ' + items['hdop']+ ' , ' + items['vdop']+ ' , ' + items['nsat']+ ' , ' + admin_area+ ' , ' + postcode+ ' , ' + land+ ','+ plaats);
  54. }
  55. else
  56. {
  57. alert('Geen land gevonden');
  58. }
  59. } else
  60. {
  61. alert('Geocoder failed due to: ' + status);
  62. }
  63. })
  64. }
  65. //alert ("dit moet eindelijk werken: "+ uitkomst);
  66. //alert ("zit in functie haalGegevensUitDatabase"+ latitudeTeZoeken +" "+ longitudeTeZoeken);
  67. console.log("index"+ item['indexs'] + ' , ' + item['RcR']+ ' , ' + item['datum'] + ' , ' + item['tijd'] + ' , ' + item['valid']+ ' , ' + item['latitude']+ ' , ' + item['n_s']+ ' , ' + item['longitude']+ ' , ' + item['e_w']+ ' , ' + item['height']+ ' , ' + item['speed']+ ' , ' + item['heading']+ ' , ' + item['pdop']+ ' , ' + item['hdop']+ ' , ' + item['vdop']+ ' , ' + item['nsat']+ ' , ' + uitkomst[0]+ ' , ' + uitkomst[1]+ ' , ' + uitkomst[2]);
  68. })
  69. })
  70. }


De eerste for-loop (regel 8) moet 10 keer worden doorlopen omdat ik 10 items in de database heb. Het systeem loopt ook wel 10 keer door de loop, alleen niet tot zover ik zou verwachten. Een for-loop zou volgens mij moeten lopen tot en met regel 64, maar in de functie hierboven loopt de loop tot aan de regel 22 en dan begint het weer bij regel 8, totdat dit 10 keer is gedaan en dan begint de programma met regel 65

Ik weet dat de functie er niet uitziet en dat ik bepaalde variabelen niet hier moet plaatsen maar omdat ik er niet uitkomt, heb ik van alles geprobeerd. Via de debug in Chrome ben ik er dus achter gekomen dat de for-loop niet zo werkt als ik zou verwachten.

Kan iemand mij hiermee helpen???

3 antwoorden

Gesponsorde links
Offline Thomas - 29/10/2014 17:15 (laatste wijziging 29/10/2014 17:29)
Avatar van Thomas Moderator Ik zie zogauw niets vreemds in de structuur (nesting van accolades klopt) of in het variabelengebruik (geen variabelen met dezelfde naam die meerdere keren worden gebruikt voor verschillende doeleinden of in de verkeerde scope).

Op regel 22 staat "geocoder". Heb je deze op een "hoger niveau" (buiten de haalGegevensUitDatabase() functie) gedeclareerd met var ervoor? Anders is deze variabele waarschijnlijk niet bekend op regel 22. Dat is eigenlijk het enige wat ik kan bedenken. Heb je al eens gecontroleerd of deze variabele undefined/null/whatever is?

EDIT: Ik heb niet veel met google maps gewerkt, maar in de snippets die ik heb doe ik meestal zoiets:
  1. // crux van dit alles: globale(re) declaratie met var:
  2. var map;
  3. var geocoder;
  4.  
  5. // standaard initialisatie meuk (in body tag staat onload="initialize()"):
  6. function initialize() {
  7. geocoder = new google.maps.Geocoder();
  8. var mapOptons = { ... };
  9. map = new google.maps.Map(document.getElementById("map-id"), mapOptions);
  10. }
  11.  
  12. // na de initialize() aanroep staan deze variabelen nog steeds "globaal"
  13. // geregistreerd omdat ze ook "globaal" gedeclareerd zijn, ondanks het feit
  14. // dat er dingen mee gebeuren binnen een functie-aanroep (die normaal zijn
  15. // eigen "scope" (variabelen-domein) heeft die na de aanroep normaliter weer
  16. // wordt vergeten)
  17.  
  18. function myFunction() {
  19. // binnen deze functie zijn map en geocoder bekend omdat deze op
  20. // een hoger niveau zijn gedeclareerd (met var ...)
  21. // etc. ...
  22. }
Offline ErickK - 29/10/2014 21:00
Avatar van ErickK Nieuw lid @FangorN
Klopt, geocoder heb ik op een hoger niveau gedeclareerd. Ik krijg nergens een undefined fout. Ik ga morgen jouw snippet een goed bekijken. Bedankt voor de moeite.
Offline Thomas - 30/10/2014 10:16
Avatar van Thomas Moderator Wat mogelijk ook nog kan is het volgende: als je code callback-functies bevat (denk aan functies die gegevens ophalen zoals bij Google maps veelvuldig gebeurt of AJAX-calls die een reactie terugverwachten) dan wordt de code na zo'n functie direct uitgevoerd terwijl de callback-functie mogelijk (en naar alle waarschijnlijkheid) nog bezig is.

Als je in de code na de callback-functie variabelen gebruikt die gevuld dienen te worden binnen de callback-functie dan is er een grote kans dat deze leeg/onvolledig zijn op het moment dat deze worden aangeroepen.

Daarom is het zaak dat de verdere verwerking van dit soort variabelen/code binnen de callback-functie zelf plaatsvindt*, of weer via een andere (callback-)functie geschiedt die aan het einde van de (eerste) callback-functie wordt aangeroepen zodat je ervan verzekerd bent dat deze "klaar" is.

De eerste keer dat je hier tegenaan loopt kan dit verwarrend zijn, maar daarna overkomt je dit meestal niet meer.

* en soms heeft een functie daar een speciale voorziening voor, denk aan de 'success' property / status van een jQuery AJAX-call, hier specificeer je een callback-functie die aangeroepen wordt als de AJAX-call succesvol is uitgevoerd.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.2s