Javascript 谷歌地图:地理编码地址异步,但得到他们的反应顺序

Javascript 谷歌地图:地理编码地址异步,但得到他们的反应顺序,javascript,ajax,google-maps,asynchronous,Javascript,Ajax,Google Maps,Asynchronous,我试图在谷歌地图中绘制两个或多个地址之间的线。这个想法是,地址在一个数组中(按照所走路线的顺序),然后数组被循环并通过谷歌地图进行地理编码,因此我有一个坐标数组: function showRoute(routes) { var points = []; var geocoder = new GClientGeocoder(); for (var i = 0; i < routes.length; i++) { geocoder.getLatLng(

我试图在谷歌地图中绘制两个或多个地址之间的线。这个想法是,地址在一个数组中(按照所走路线的顺序),然后数组被循环并通过谷歌地图进行地理编码,因此我有一个坐标数组:

function showRoute(routes) {
    var points = [];
    var geocoder = new GClientGeocoder();
    for (var i = 0; i < routes.length; i++) {
        geocoder.getLatLng(routes[i], function(point) {
            points.push(point);
            drawRoute(points, routes);
        });
    }
}
功能显示路线(路线){
var点=[];
var geocoder=new GClientGeocoder();
对于(变量i=0;i
只有当传递给它的数组与原始routes数组的长度相同时,drawRoute()函数才会运行

大多数情况下,这很好用。但是,如果从地理编码器获得任何值的响应时出现延迟,则会中断,因为这将导致它们出现故障

我对这个问题的第一次尝试如下:

function showRoute(routes) {
    var points = [];
    var geocoder = new GClientGeocoder();
    for (var i = 0; i < routes.length; i++) {
        geocoder.getLatLng(routes[i], function(point) {
            points[i] = point;
            drawRoute(points, routes);
        });
    }
}
功能显示路线(路线){
var点=[];
var geocoder=new GClientGeocoder();
对于(变量i=0;i
但是,由于函数异步运行,这意味着地理代码回调中的i值始终是routes数组的长度,因此它将继续覆盖相同的值


有人有什么想法吗?

您想一次编写一个地理代码,并让回调调用下一个地理代码。这将保证订购

例如:

var-map=null;
var-geocoder=null;
var-next=0;
var点=[];
变量地址=[
“华盛顿州西雅图第一大道1521号”,
“华盛顿州西雅图第二大道2222号”,
华盛顿州西雅图美世街14号
];
函数初始化(){
if(GBrowserIsCompatible()){
map=newgmap2(document.getElementById(“map_canvas”);
赛特中心地图(新格拉特林(47.61630,-122.34546),13);
map.setUIToDefault();
geocoder=新的GClientGeocoder();
geocodeAll();
}
}
函数geocodeAll(){
if(下一个
好的。因此,在回答这个问题之前,我必须做一个简单的练习,重新阅读闭包是如何工作的(似乎每当我想到闭包时,我都必须这样做)

外部函数返回时设置索引变量的值(在本例中为showRoute)。因此我认为,您只需将getLatLng封装在另一个函数中,该函数将索引作为参数:

function processPoint (geocoder, routes, i, points)
{
    geocoder.getLatLng(routes[i], function(point) {
        points[i] = point;
        drawRoute (points, routes);
        });
}
因此,showRoute中的循环变成:

var geocoder=new GClientGeocoder();
对于(变量i=0;i

这样,getLatLng回调就可以访问适当的索引值。我做了一个实验来证明这一点。你可以找到这个问题的来源。

这也是我的第一反应(事实上,我在过去使用过这种方法),但我认为你可以避免按顺序执行请求;不过我尽量避免按顺序走,因为速度比较慢。谢谢!这正是我想做的。好东西:)。谢谢你的提问。这促使我对这一问题进行适当的研究。
function processPoint (geocoder, routes, i, points)
{
    geocoder.getLatLng(routes[i], function(point) {
        points[i] = point;
        drawRoute (points, routes);
        });
}
var geocoder = new GClientGeocoder();
for (var i = 0; i < wp.length; i++) 
     processPoint (geocoder, routes, i, points);