谷歌用javascript在一个循环中对多个地址进行地理编码,我如何知道什么时候一切都完成了?
我有一个表单,要求提供一个位置列表(不是很多,通常只有3或4个,但这个数字是动态的)。提交表单时,我必须解析数据,使用谷歌地理编码获取位置,然后按顺序画一条连接点的线。我已经完成了解析工作,但我仍然停留在地理编码部分,主要是因为它的异步性质。假设我的地址字符串存储在数组“addresses”中,这就是我得到的结果:谷歌用javascript在一个循环中对多个地址进行地理编码,我如何知道什么时候一切都完成了?,javascript,asynchronous,google-maps-api-3,callback,geocode,Javascript,Asynchronous,Google Maps Api 3,Callback,Geocode,我有一个表单,要求提供一个位置列表(不是很多,通常只有3或4个,但这个数字是动态的)。提交表单时,我必须解析数据,使用谷歌地理编码获取位置,然后按顺序画一条连接点的线。我已经完成了解析工作,但我仍然停留在地理编码部分,主要是因为它的异步性质。假设我的地址字符串存储在数组“addresses”中,这就是我得到的结果: function someFunction(addresses) { var coords = []; for(var i = 0; i < addresses.len
function someFunction(addresses) {
var coords = [];
for(var i = 0; i < addresses.length; i++) {
currAddress = addresses[i];
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({'address':currAddress}, function (results, status)
if (status == google.maps.GeocoderStatus.OK) {
coords.push(results[0].geometry.location);
}
else {
throw('No results found: ' + status);
}
});
}
}
// Initially I tried to work with the data here, but it wasn't all present yet.
}
函数someFunction(地址){
var-coords=[];
对于(变量i=0;i
画这条线很容易,当用户提供地理纬度/液化天然气坐标时,我曾经这样做过。我的问题是,因为坐标只添加到回调中,我如何知道它何时完成?我不能将其转储到函数中并放入回调,因为我需要等到所有坐标都处理完毕
我还读到有人对结果没有按顺序返回有问题,但我不理解给出的回答。如果有人能回答我的具体问题并确保结果正常,我将不胜感激
NB:我用手炸了那个代码,所以可能有打字错误。到目前为止,我的实际代码“起作用”,我只是不知道在处理完所有地址后,我该从我必须做的事情转向做些什么。此外,目前正在开发一个内部测试应用程序。一旦测试完成,它将完全符合谷歌的TOS。这意味着我没有可以链接的页面。整个应用程序也有2000多行代码,目前包含一些公司专有信息,这些信息最终将被淘汰,因此粘贴整个应用程序或将其发送出去是不可行的。我希望这不会造成太大的问题。您可以通过比较结果数量和地址数量来检查所有呼叫是否已完成:
function someFunction(addresses) {
var currAddress, coords = [];
for (var i = 0; i < addresses.length; i++) {
currAddress = addresses[i];
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({'address':currAddress}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
coords.push(results[0].geometry.location);
// Check if all calls have been processed
if (coords.length == addresses.length) {
someOtherFunction(coords);
}
}
...
});
}
}
}
function someOtherFunction(coords) {
// Geocoding has been done for all addresses
...
}
var getLatLng = function(addresses, callback) {
var coords = [];
addresses.forEach(function(address) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
coords.push([lat, lng]);
// all addresses have been processed
if (coords.length === addresses.length)
callback(coords);
}
});
});
}
getLatLng(allAddresses, function (results) {
console.log("received all addresses:", results);
});
函数someFunction(地址){
变量currAddress,坐标=[];
对于(变量i=0;i
函数someFunction(地址、回调){
var-coords=[];
对于(变量i=0;i
回调函数的使用是惊人的如果您正在使用诸如
jQuery
之类的库,您可以利用通过geocoder.geocode>函数执行可链接请求
示例
函数initMap(){
var geocoder=new google.maps.geocoder();
变量addreses=[
{“lat”:60.173890,“lng”:24.941025},
{“lat”:60.461608,“lng”:22.266598},
{“lat”:61.498714,“lng”:23.760940}
];
var deferreds=getGeocodeAddressDeferred(geocoder,addreses);
$.when.apply($,延迟).done(函数(位置){
//打印结果
$.each(参数、函数(i、数据){
$(“div#result”)。追加(数据+”
);
});
});
}
函数getGeocodeAddressDeferred(geocoder,addreses){
风险值递延=[];
$.each(地址、功能(i、地址){
推送(地理编码地址(地理编码者,地址));
});
延期归还;
}
功能geocodeAddress(geocoder,latLng){
var deferred=$.deferred();
geocoder.geocode({'location':latLng},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
已延迟。解析(结果[0]。格式化的\u地址);
}
});
延迟返回。承诺();
}
这是一个非常古老的问题,但在给定的答案中存在一个闭包问题,因此最终结果具有相同的lat,所有地址都很长
最好使用addresses.forEach遍历所有地址,以便包含每个地理编码地址,如果目标浏览器是现代的,这应该可以很好地工作。否则,您必须定义一个输出
var getLatLng = function(addresses, callback) {
var coords = [];
addresses.forEach(function(address) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
coords.push([lat, lng]);
// all addresses have been processed
if (coords.length === addresses.length)
callback(coords);
}
});
});
}
getLatLng(allAddresses, function (results) {
console.log("received all addresses:", results);
});