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