谷歌用javascript在一个循环中对多个地址进行地理编码,我如何知道什么时候一切都完成了?

谷歌用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

我有一个表单,要求提供一个位置列表(不是很多,通常只有3或4个,但这个数字是动态的)。提交表单时,我必须解析数据,使用谷歌地理编码获取位置,然后按顺序画一条连接点的线。我已经完成了解析工作,但我仍然停留在地理编码部分,主要是因为它的异步性质。假设我的地址字符串存储在数组“addresses”中,这就是我得到的结果:

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);
        });