Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌地图/维基百科AJAX循环调用问题_Javascript_Google Maps - Fatal编程技术网

Javascript 谷歌地图/维基百科AJAX循环调用问题

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

我正在尝试使用for循环在infowindow中使用wikipediaajax数据生成Google地图标记。我认为有一个时间问题正在发生,但几周后我想不出如何解决它。当我将一个标识符硬编码到for循环中以替换I(例如2)时,代码工作得很好……但是当我使用I时,我会收到错误,说“无法读取未定义的属性[whatever]”。我已经尝试过setTimeout和回调,但我似乎无法理解

这是我的密码:

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