这是一个简单的问题,但我无法解决。
具体细节并不重要,但这是要点。我有一些像这样的代码:
var lat = 0;
var lon = 0;
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
lat = position.coords.latitude;
lon = position.coords.longitude;
});
}
我认为它的作用是:
然而,在那个块的末尾,lat和lon仍为0.我尝试添加var
s,将lat和lon传递给函数等但没有成功......
我如何使这项工作?
答案 0 :(得分:6)
这是一个异步回调。基本上,您将函数传递给导航器API。然后,您的代码继续(并做任何事情)。稍后,导航器API会使用答案(位置)调用您的回调。因此,任何使用position的东西都必须在回调内部(包括被调用)。
另请参阅this previous answer,其中显示了如何创建和使用包装函数。
编辑:您可以简单地编写一个调用回调的函数。如果需要,getLocation可以将另一个标志传递给其参数(例如,失败/成功代码)。
function getLocation(callback)
{
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(callback);
}
else {
callback(null);
}
}
然后:
getLocation(function(pos)
{
//do stuff
if(pos != null)
{
// loc stuff
}
// more stuff
});
您不必使用匿名函数。
答案 1 :(得分:2)
这与范围无关。 getCurrentPosition
被异步调用,这意味着它将在收到位置之前立即返回。只有在实际接收到地理位置时才会调用function(position)
。
答案 2 :(得分:1)
getCurrentPosition()是异步的 - 值不会立即更新。
getCurrentPosition()
方法需要一个,两个或三个参数。调用时,必须立即返回,然后异步尝试获取设备的当前位置。如果尝试成功,则必须使用新的Position对象调用successCallback
(即必须在回调对象上调用handleEvent
操作),以反映设备的当前位置。如果尝试失败,则必须使用新的errorCallback
对象调用PositionError
,以反映失败的原因。
alert
函数中的值,您将看到更改。编写代码以在函数内执行您想要的任何操作(或将它们抽象到另一个函数并从那里调用它),而不是在if
块之后继续。为安全起见,也要添加错误回调。