Weather app - variable assignment

Hi guys,

I’m trying to do the weather app at the moment and got stuck on something which I hope you can help me with. Here’s the code:

  var lat;
  var lon;
  if (navigator.geolocation){
    navigator.geolocation.getCurrentPosition(function(position){
      lat = position.coords.latitude;
      lon = position.coords.longitude;   
      console.log(lat);
    });
  }
  console.log(lon);

so my problem was the global variables “lat” and “lon” were not changed outside of the if statement and I do not understand why. the console.log(lat) statement in the if statement worked correctly but the console.log(lon) statement at the end returned “undefined”.

I meanwhile figured out that I can do the lat and lon assignment outside of the if statement but I’d really like to know the reason behind it.

thanks for any help

Getting the geolocation works asynchronous. So the console.log will have run before the geolocation finished getting the location. You can call a function inside of the getCurrentPosition:

  var lat;
  var lon;
  if (navigator.geolocation){
    navigator.geolocation.getCurrentPosition(function(position){
      lat = position.coords.latitude;
      lon = position.coords.longitude;  
      someFunction();
      console.log(lat);
    });
  }
  console.log(lon);

  function someFunction(){
    console.log(lat, lon);
  }
1 Like

[EDIT] Wish I could delete my stupid attempt at an answer but then @BenGitter 's answer wouldn’t make sense and what he says actually helped me. I shall endure my embarrassment then !

I’m not sure I get your question but as to why console.log(lon) returns undefined when outside the if is about scope. You can think of the curly brackets as membranes isolating bits of code, or like bubbles.

So in this case, your console.log(lon) has the Browser (or whatever) looking for the variable lon in the global bubble, and in the global scope you haven’t defined it: var lon;.

Whereas console.log(lat) is in the same bubble (it’s in the curly brackets of your if statement) and so lat is defined as lat = position.coords.latitude.

oh sh*** have I said something completely stupid then?

sorry… :flushed:

so if I understand you correctly, the variables lat and lon were assigned the new value, it just happened after my whole program has run and therefore too late??

maybe I should explain that I only did the console.log statements to see what’s going on. I am using lat and lon in the url to get the weather data and lat and lon show up as “undefined”

Do you have a CodePen or something? It should work if you call a function from within the getCurrentPosition.[quote=“bluecherryme, post:5, topic:66714”]
the variables lat and lon were assigned the new value, it just happened after my whole program has run and therefore too late?
[/quote]

Yes, since it happened async, your program kept running (in this case only the console.log) and some time after that the values were changed.

here’s the link to my codepen: http://codepen.io/bluecherryme/pen/JbLdXp
I thought I had it working but I was mistaken
how to I get the longitude and latitude assigned to my variables lon and lat?
I know it seem so easy…that’s why it is so annoying grrr

Kinda :slight_smile: Though what you said, should be one of the first things to check if you unexpectedly get undefined.

Since lat and lon are defined outside any function, changing their value inside the function will not change their scope (which is outside the function).

If you use var if-statements are not considered different scopes. I believe if you use let they are limited to that block.

1 Like

Are you using Chrome? Chrome won’t allow geolocation acces if you use http. And if you use https they want you to use https for other requests as well, so your api call should be to a secure (https) API. Unfortunately, openweathermap only supports http.

Basically, there are a lot of tiny little things that makes this project really difficult. It is really important to have your browser console open to see if there are any errors.

Will have a look now…

it is working though. the console.log statement within the if statement returns the correct value.
I’ve tested all the single parts and they are all working by themselves.

I’m just trying to wrap my head around how to change the global variables lon and lat from within the if statement?

Yes, geolocation should work (use https on Chrome).

BTW: Bootstrap needs jQuery, so you should first add jQuery and then Bootstrap (in the JS settings tab). You can swap them by dragging one of them, using the “hamburger” icon on its left.

EDIT: So to get it to work you need to change this:

  • wrap all the API code in a function. From var APIKey = ... till the end (request.send)
  • call that function in the getCurrentPosition callback.
  • to ensure it works in Chrome: always use https when you link to your codepen and change API to: var API = "https://cors-anywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&APPID=" + APIKey;

cors-anywhere.herokuapp.com is just a trick to let Chrome think you are using a secure connection (https), but it just routes the openweathermap api (http).

Also, since you are already using jQuery, using $.getJSON is super easy:

$.getJSON(API, function(data){
  console.log(data);
});

thanks for your help Ben, I will get working on that…it makes sense now…