当我运行它时,变量elevationPoint
在第一个警报上未定义。我意外地注意到它适用于第二个警报。那是为什么?
var elevator = new google.maps.ElevationService();
var coordinates = new google.maps.LatLng(closestLat , closestLng);
var pointElevation;
elevator.getElevationForLocations({
'locations':[coordinates]
}, function (results, status) {
if (status == google.maps.ElevationStatus.OK) {
// Retrieve the first result
if (results[0]) {
pointElevation = results[0].elevation;
} else {
alert('No results found');
}
}
else {
alert('Elevation service failed due to: ' + status);
}
});
alert(pointElevation);
alert(pointElevation);
答案 0 :(得分:0)
因为pointElevation
是在异步调用getElevationForLocations()
中定义的。第二次警报是偶然的,因为那时异步调用已经完成,但是不能保证。
答案 1 :(得分:0)
您将回调传递给正在使用的API这一事实让我觉得它是异步的。
当您发出第一个警报时,异步任务尚未完成。当第二个警报触发时,回调已完成,并且您获得了youbexoex变量的预期值。尝试在传递给API的函数中移动警报,它应该可以工作。
问候
修改以清除阻止/非阻止主题
需要回调的函数通常是异步的,它们在一个名为eventLoop的独立线程上运行。代码在评估后立即执行,因此您的API调用会立即触发,并将其置于事件循环中。当第一个警报到达时,异步操作已经在eventLoop上,因此虽然警报阻止但它不能阻止在单独的线程上运行的代码。当执行第二个警报时,异步代码已经完成并且执行了回调,这就是为什么你可以看到第二个警报上的值。
我建议您调查事件循环及其工作原理 这是一个很棒的视觉解释https://m.youtube.com/watch?v=8aGhZQkoFbQ