我是javascript的新手。我尝试使用以下代码将值设置为变量但失败了。有人请帮助指出我的代码有什么问题。
当我尝试打印变量" deviceLatitude"的值时,它会给我" undefined"。但是如果我从函数内部打印值,它会给我正确的值。我做错了什么?
我需要为此值设置全局变量的原因是因为我需要在后期使用它,例如根据需要比较不同位置的距离。
var deviceLatitude;
var deviceLongitude;
function suc (p) {
deviceLatitude = p.coords.latitude;
deviceLongitude = p.coords.longitude;
// alert(deviceLatitude);
}
intel.xdk.geolocation.getCurrentPosition(suc);
alert(deviceLatitude);
答案 0 :(得分:2)
suc
被异步回叫,因此当您在调用intel.xdk....
后发出提醒时,suc
尚未被调用。
请注意文档,我的重点:
使用此命令获取当前位置。这个命令 异步获取近似的纬度和经度 设备。当数据可用时,将调用成功函数。如果 获取位置数据时出错,调用错误函数。
因此,如果您想对deviceLatitude
执行某些操作,则必须在内部进行回调。
如果您是承诺类型的人,您可以这样做:
function getCurrentPosition() {
return new Promise(function(resolve, reject) {
intel.xdk.geolocation.getCurrentPosition(resolve, reject);
});
}
getCurrentPosition.then(
function(p) {
//do something with p.coords.latitude
},
function() {
//something went wrong
}
);
答案 1 :(得分:2)
尝试为成功创建匿名函数,为错误创建其他函数。 然后创建另一个函数,当数据可用时,将由异步调用。
function overrideLocalStore(lat, log)
{
alert("lat"+lat+" long"+long);
localStorage.setItem("deviceLatitude", lat);
localStorage.setItem("deviceLongitude", log);
}
intel.xdk.geolocation.getCurrentPosition(
function(p)
{
alert("geolocation success");
if (p.coords.latitude != undefined)
overrideLocalStore(p.coords.latitude, p.coords.longitude);
},
function()
{
alert("geolocation failed");
getLocation();
}
);
// Use whatever you need
alert(localStorage.getItem("deviceLatitude"));
alert(localStorage.getItem("deviceLongitude"));
答案 2 :(得分:1)
正如@torazaburo指出的那样,不可能将异步函数数据输出到全局变量中。
但要实现所需,解决方法可以解决这个问题。由于这是HTML5应用程序,因此可以使用localStorage保存值,并在以后的任何时间从其他屏幕/功能访问它。
一个简单的示例代码如下:
intel.xdk.geolocation.getCurrentPosition(
function(p) {
if (p.coords.latitude != undefined) {
localStorage.deviceLatitude = p.coords.latitude;
localStorage.deviceLongitude = p.coords.longitude;
}
},
function() {
alert("geolocation failed");
}
);