2017-01-26 123 views
2

我試圖獲取地理位置數據,然後將該數據合併到$ ajax調用URL中。但是會發生什麼呢,console.log(緯度/經度)調用都會返回初始值(0)。這意味着,地理位置呼叫來不及回和$ Ajax調用簡單地使用默認值作出的:http://api.openweathermap.org/data/2.5/weather?lat=0&lon=0&appid=9011468f93d0dac073b28cda9e83cd01

var lat = 0; 
var lon = 0; 

console.log(lat); 
console.log(lon); 

if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(pos){ 
    lat = pos.coords.latitude; 
    lon = pos.coords.longitude; 
    }) 
} 

function getWeatherData() { 
    console.log(lat); 
    console.log(lon); 
    setTimeout(function(){ 
    $.ajax({ 
    url: "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&appid=9011468f93d0dac073b28cda9e83cd01", 
    success: function (data) { 
     console.log(data); 

    }, 
    error: function() { 
     console.log("REKT"); 
    } 
    }) 
}, 1000); 
} 

$(document).ready(function() { 
    getWeatherData(); 
    }); 

我解決它是附加了任意超時功能於$ Ajax調用,但如果什麼通話時間超過1000或10000ms返回? 所以,我的問題是有沒有一個更優雅的解決方案,使$ Ajax調用只有在地理位置代碼執行完畢?

回答

3

移動調用getCurrentPosition

業增加值的回調:如果地理位置不存在,它不會調用getWeatherData。現在,你總是把它

$(function() { 
    if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(pos){ 
    lat = pos.coords.latitude; 
    lon = pos.coords.longitude; 
    getWeatherData(); 
    }); 
    } 
}); 

而且這樣的:https://developers.google.com/web/updates/2016/04/geolocation-on-secure-contexts-only

+0

我選擇這個作爲回答,只是因爲它是一個更加模塊化的解決方案。 我試着寫一些代碼來仔細看看數據流:http://pastebin.com/1w2fiXz8 因此,即使「初始化...」首先激發「成功」!僅在「啓動getWeatherData」之後才被記錄。我在編碼方面有點新,但是根據這個:調用回調函數,直到它回調(因此名稱),其他代碼繼續執行。 「成功!」僅在函數回調時執行?總之,回調函數本質上是異步的? – Anon

+0

他們是一個異步調用的結論。 – mplungjan

1

打電話給你ajax功能在navigator.geolocation.getCurrentPosition

var lat = 0; 
 
var lon = 0; 
 

 
function getWeatherData(){ 
 

 
    if (navigator.geolocation) { 
 

 
    navigator.geolocation.getCurrentPosition(function(pos){ 
 
     lat = pos.coords.latitude; 
 
     lon = pos.coords.longitude; 
 
    
 
     $.ajax({ 
 
      url: "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon +  "&appid=9011468f93d0dac073b28cda9e83cd01", 
 
      success: function (data) { 
 
      console.log(data); 
 
      }, 
 
      error: function() { 
 
      console.log("REKT"); 
 
      } 
 
     }); 
 
    }); 
 
    } 
 
} 
 
              
 

 
$(document).ready(function() { 
 
    getWeatherData(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

但你會看到谷歌瀏覽器

getCurrentPosition()和watchPosition()錯誤沒有在不安全的 起源不再起作用。要使用此功能,你應該考慮你的 應用切換到一個安全的起點,如HTTPS

你可以在這裏看到Google Insecure origins