假设我有这些地理编码调用:
function myFunction(marker1,marker2) {
var firstAddress = null;
var secondAddress = null;
geocoder.geocode({'latLng': marker1.getPosition()}, function(results, status) {
# if geocoding successful, set firstAddress
})
geocoder.geocode({'latLng': marker2.getPosition()}, function(results, status) {
# if geocoding successful, set secondAddress
})
return [firstAddress,secondAddress];
假设我调用了 myFunction
。地理编码调用是异步的,对吧?因此它将快速执行并返回,调用结果回调。当我返回地址时,地理编码是否已经完成?如何确保两个函数在返回前完成?
最佳答案
简短的回答:没有。您几乎会立即到达 myFunction
的返回行,很可能在 AJAX 完成之前好。
最好的办法是强制 geoCoder 的请求同步。如果不能,那么您需要做的是设置一个全局标志,指示两个请求何时完成并等待设置该标志。如果是,那么您可以收集数据、构建数组并将其返回。
function myFunction(marker1,marker2) {
var firstAddress = null;
var secondAddress = null;
document.geoCodeRequestCompleteFlag = 0;
geocoder.geocode({'latLng': marker1.getPosition()}, function(results, status) {
# if geocoding successful, set firstAddress
})
geocoder.geocode({'latLng': marker2.getPosition()}, function(results, status) {
# if geocoding successful, set secondAddress
})
setTimeout( function( ) {
document.geoCodeRequestCompleteFlag = -1;
}, 15000 ); // -- ensure that we don't get stuck indefinitely
while( document.geoCodeRequestCompleteFlag < 2 && document.geoCodeRequestCompleteFlag > 0 ) {
// wait
}
if( document.geoCodeRequestCompleteFlag < 0 ) {
return 'timeout';
} else {
return [firstAddress,secondAddress];
}
}
请务必在您的 marker1.getPosition()
和 marker2.getPosition()
回调中添加一个 document.geoCodeRequestCompleteFlag++
。
这样做的缺点是,如果您的请求需要很长时间,浏览器可能会终止您的脚本。
关于javascript - 该函数会在返回之前等待异步函数完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284457/