全局变量表示未定义,除非我使用两次



运行此程序时,变量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);

将回调传递给正在使用的API,这让我认为它是异步的。

发出第一个警报时,异步任务尚未完成。当第二个警报触发时,回调已经完成,并且您获得了bexoex变量的预期值。尝试在传递给API的函数中移动警报,它应该可以工作。

问候

编辑以清除阻止/非阻止主题

需要回调的函数通常是异步的,它们在一个名为eventLoop的单独线程上运行。代码在评估后立即执行,因此API调用立即激发,并将其置于事件循环中。当到达第一个警报时,异步操作已经在eventLoop上,因此尽管警报正在阻止,但它不能阻止在单独线程上运行的代码。当执行第二个警报时,异步代码已经完成并执行了回调,这就是为什么您可以在第二个警告上看到值。

我建议您调查事件循环及其工作方式这是一个奇妙的视觉解释https://m.youtube.com/watch?v=8aGhZQkoFbQ

因为pointElevation是在异步调用getElevationForLocations()中定义的。第二次警报工作的偶然性是因为异步调用已经完成,但不能保证。

最新更新