Mam taki kod:

http://goo.gl/Lr3ZcJ

var getPositionByGeolocation = function() {
  var geolocation = {};
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
      //console.log(position.coords.latitude);
      //console.log(position.coords.longitude);
      geolocation = {
        lat: position.coords.latitude,
        lon: position.coords.longitude
      };
      //console.log(JSON.stringify(geolocation));
    });
    return geolocation;
  } else {
    return false;
  }
}

var getPositionByIP = function() {
    var IPPosition = {};
    $.ajax({
      url: 'https://freegeoip.net/json/',
      success: function(response) {
        IPPosition.lat = response.latitude;
        IPPosition.lon = response.longitude;
        //console.log(IPPosition.lat);
      }
    });
    //console.log("I'm here");
    return IPPosition;
  }

$(document).ready(function() {
  var userPosition = false;
  var userPosition = getPositionByGeolocation();
  if (userPosition == false) {
    userPosition = getPositionByIP();
  }

  $('h2').text(JSON.stringify(userPosition));
});

który (w pierwszej kolejności) ma określić lokalizacje użytkownika na podstawie lokalizacji urządzenia (poprzez navigator.geolocation) albo na podstawie lokalizacji IP. Generalnie kod nie działa i z tego co już rozgryzłem to winne jest asynchroniczne wywołanie kodu, które powoduje, że np. funkcja getPositionByGeolocation zwraca wartość zanim zostaną do niej przypisane właściwe parametry w navigator.geolocation.getCurrentPosition . W jaki sposób "zmusić" js żeby zaczekał do końca działania wywołania asynchronicznego ? Normalnie przy prosty przypadkach cała obsługę "po" robiło się w callbacku ale tutaj chciałem to podzielić na jakieś części logiczne, żeby nie zagnieżdżać jednego wywołania w drugie.