Javascript 谷歌地图/维基百科AJAX循环调用问题
我正在尝试使用for循环在infowindow中使用wikipediaajax数据生成Google地图标记。我认为有一个时间问题正在发生,但几周后我想不出如何解决它。当我将一个标识符硬编码到for循环中以替换I(例如2)时,代码工作得很好……但是当我使用I时,我会收到错误,说“无法读取未定义的属性[whatever]”。我已经尝试过setTimeout和回调,但我似乎无法理解 这是我的密码:Javascript 谷歌地图/维基百科AJAX循环调用问题,javascript,google-maps,Javascript,Google Maps,我正在尝试使用for循环在infowindow中使用wikipediaajax数据生成Google地图标记。我认为有一个时间问题正在发生,但几周后我想不出如何解决它。当我将一个标识符硬编码到for循环中以替换I(例如2)时,代码工作得很好……但是当我使用I时,我会收到错误,说“无法读取未定义的属性[whatever]”。我已经尝试过setTimeout和回调,但我似乎无法理解 这是我的密码: var映射; var标记; var信息窗口; var-wikiURL; var i; var文本; v
var映射;
var标记;
var信息窗口;
var-wikiURL;
var i;
var文本;
var venueInfo;
var标记=[];
var-markerNames=[];
var wikiurl=[];
var venueArray=[];
//模型-宾夕法尼亚州PGH的职业/学院体育场。
var场馆=[
{
名称:“PNC公园”,
拉脱维亚:40.446855,
液化天然气:-80.0056666
},
{
名称:“亨氏场”,
纬度:40.4466765,
液化天然气:-80.01576
},
{
名称:“PPG颜料竞技场”,
拉脱维亚:40.439593,
液化天然气:-79.989338
},
{
名称:“Highmark体育场”,
纬度:40.4362358,
液化天然气:-80.009592099999
},
{
名称:“彼得森活动中心”,
拉脱维亚:40.443828,
液化天然气:-79.962283
}
];
//标记创建者
函数createMarker(){
对于(i=0;i,正如@jeffcarey所说,修复循环并将ajax代码移动到单独的函数
function doAjax(i){
wikiURL = 'http://en.wikipedia.org/w/api.php?action=opensearch&search=' +venues[i].name+ '&format=json&callback=wikiCallback';
wikiURLs.push(wikiURL);
$.ajax ({
url: wikiURL,
dataType: "jsonp",
success: function(data){
text = data[2];
venueInfo = text[0];
marker = new google.maps.Marker({
position: {lat: venues[i].lat, lng: venues[i].lng},
map: map,
draggable: false,
content: '<h2>'+venues[i].name+'</h2><p>'+venueInfo+'</p>'
});
markerNames.push(venues[i].name);
markers.push(marker);
infowindow = new google.maps.InfoWindow({
content: this.content
});
marker.addListener('click', function(){
infowindow.setContent(this.content);
infowindow.open(map, this);
});
}
});
}
function createMarker(){
for (i=0; i < venues.length; i++){
doAjax(i);
}
}
函数doAjax(i){
维基网址http://en.wikipedia.org/w/api.php?action=opensearch&search=“+Victories[i].name+”&format=json&callback=wikiCallback';
推送(wikiURL);
$.ajax({
url:wikiURL,
数据类型:“jsonp”,
成功:函数(数据){
文本=数据[2];
venueInfo=文本[0];
marker=新的google.maps.marker({
位置:{lat:场馆[i]。lat,lng:场馆[i]。lng},
地图:地图,
可拖动:错误,
内容:''+场馆[i].名称+''+venueInfo+''
});
markerNames.push(场馆[i].name);
标记器。推(标记器);
infowindow=新建google.maps.infowindow({
content:this.content
});
marker.addListener('click',function()){
infowindow.setContent(this.content);
打开(地图,这个);
});
}
});
}
函数createMarker(){
对于(i=0;i<1.length;i++){
doAjax(i);
}
}
在循环内调用异步函数会导致一个常见问题。解决此问题的一种方法(i
在回调函数运行时超过输入数组的末尾)是使用立即调用的函数表达式(IIFE)它保存i
变量的闭包,因此当执行回调函数时,它具有“正确”的值:
console在您访问场馆[i]之前记录i的值。然后阅读闭包。另外,修复您的循环:isuccess: (function(i) {
return function(data) {
text = data[2];
venueInfo = text[0];
console.log(venueInfo);
marker = new google.maps.Marker({
position: {
lat: venues[i].lat,
lng: venues[i].lng
},
map: map,
draggable: false,
content: '<h2>' + venues[i].name + '</h2><p>' + venueInfo + '</p>'
});
markerNames.push(venues[i].name);
markers.push(marker);
infowindow = new google.maps.InfoWindow({
content: this.content
});
marker.addListener('click', function() {
infowindow.setContent(this.content);
infowindow.open(map, this);
});
}
}(i))