我有以下几行代码。一切都有效,除了设置变量" UserLocation"并将其打印到控制台。我的目标是将我在showPosition()函数中找到的坐标作为一个可以在任何地方访问的全局变量,因为我将使用它们很多并且用于许多目的。
我在这里缺少什么?我已经尝试将showPosition中的坐标变量设置为全局变量,尝试返回变量等。我现在可以从该函数中获取这些坐标的唯一方法是将其作为参数传递给另一个我不想做的功能。
if (navigator.geolocation) {
var UserLocation = navigator.geolocation.getCurrentPosition(showPosition);
console.log(UserLocation); // This doesn't work and gives me "undefined"
} else {
alert("Geolocation is not supported by this browser");
}
function showPosition(position) {
var coordinates = new Array();
coordinates.push(Math.floor(position.coords.latitude));
coordinates.push(Math.floor(position.coords.longitude));
console.log(coordinates) // This works
return coordinates;
}
答案 0 :(得分:2)
navigator.geolocation.getCurrentPosition
是异步的。如评论中所示,这意味着UserLocation
将在getCurrentPosition
完成之前未定义。
Promise非常适合处理异步代码。以下使用ECMA6承诺设置您的全局变量:
function getUserLocation() {
return new Promise(function(resolve, reject) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(resolve);
} else {
reject("Geolocation is not supported by this browser")
}
});
}
function showPosition(position) {
var coordinates = new Array();
coordinates.push(Math.floor(position.coords.latitude));
coordinates.push(Math.floor(position.coords.longitude));
console.log(coordinates) // This works
return coordinates;
}
function setGlobalCoordsAndAlert(coordinates) {
window.coordinates = coordinates;
alert(coordinates);
}
getUserLocation()
.then(showPosition)
.then(setGlobalCoordsAndAlert)
.catch(function(err) {
console.log(err);
});
ECMA6承诺在旧浏览器中不可用,因此如果您担心兼容性,请查看polyfill。