Google Maps API v3.30:声明数据层的forEach方法无法执行求助
解决Google Maps API v3.30中Data图层forEach无法执行的问题
这个问题我做项目时也踩过一模一样的坑,核心原因其实很直白——loadGeoJson()是异步执行的方法!你现在的代码里,调用loadGeoJson()后立刻就跑forEach(),这时候GeoJSON数据还在加载的路上,图层里根本没有任何feature,自然不会触发forEach里的逻辑。
给你两种靠谱的解决方案:
方案一:使用loadGeoJson()的回调函数(推荐)
loadGeoJson()本身支持第三个参数,就是数据全部加载完成后的回调函数,所有依赖GeoJSON数据的操作都可以放在这里面,能保证数据就绪后再执行:
var myLayer = new google.maps.Data(); myLayer.setStyle(function (feature) {return defaultStyle(feature); }); myLayer.setMap(map); // 把forEach逻辑放到loadGeoJson的回调里 myLayer.loadGeoJson( 'Content/Maps/myGeoJsonData.geojson', null, // 第二个参数是可选的过滤函数,不需要就传null function(features) { // 这里所有feature都已经加载完成了 myLayer.forEach(function (feature) { console.log("Test"); // 你的其他feature处理逻辑也可以放在这里 }); } );
方案二:监听addfeature事件
如果需要在每个feature被添加到图层时就处理,也可以监听图层的addfeature事件,不过这个事件会在每个feature加载完成时触发一次(比如GeoJSON里有10个feature,就触发10次):
var myLayer = new google.maps.Data(); myLayer.setStyle(function (feature) {return defaultStyle(feature); }); myLayer.setMap(map); // 监听单个feature添加完成的事件 myLayer.addListener('addfeature', function(e) { console.log("单个feature加载完成:", e.feature); // 针对单个feature的处理逻辑 }); myLayer.loadGeoJson('Content/Maps/myGeoJsonData.geojson');
关键提醒
Google Maps API里很多数据加载相关的方法都是异步的,一定要记住不要在异步方法调用后立刻执行依赖其返回数据的代码,必须等待数据加载完成的信号(回调函数、事件监听)再执行后续逻辑。
内容的提问来源于stack exchange,提问作者Mackija
相关产品推荐
相关产品推荐

