假设我有这些地理编码调用:
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
。地理编码调用是异步的,对吧?所以它会快速执行并返回,在结果上调用回调。当我返回地址时,地理编码会完成吗?我如何确保在返回之前完成这两个功能?
答案 0 :(得分:5)
简答:不。在AJAX完成之前,您几乎会立即到达myFunction
的返回行,很可能是井。
最好的办法是强制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];
}
}
请务必在document.geoCodeRequestCompleteFlag++
和marker1.getPosition()
回调中添加marker2.getPosition()
。
缺点是,如果您的请求需要很长时间,浏览器可能会终止您的脚本。
答案 1 :(得分:1)
如果geocoder lib实际上是异步的,那么在获得实际数据之前将返回数组。
两种方式(我认为可以解决这个问题),使myFunction基于回调或强制地理编码器以某种方式同步
答案 2 :(得分:1)
var allAddresses = [];
var coordinate = function(address) {
allAddresses.push(address); // addAddresses is bound to this function via closure
if (allAddresses.length === 2) {
// proceed
}
}
然后,您可以在回调中调用coordinate
谷歌API。
请注意,您需要处理错误情况,但使用上述模板应该非常简单....