经过数小时的搜索,我的代码问题如下。 事实上,我的回答并不是很远,但我仍然被封锁......
我有一个在循环中调用的匿名函数,我想访问并刷新全局变量,但我尝试使用window.myvariable,使用另一个函数,没有任何反应...
这是我的代码:
for (var i = 0; i < SHP_files.length; i++) {
shapefile = new Shapefile({
shp: "shp/polygon/"+SHP_files[i]+".shp",
dbf: "shp/polygon/"+SHP_files[i]+".dbf",
}, function(data) {
polygon_layer.addLayer(new L.GeoJSON(data.geojson,{onEachFeature: onEachFeature, style: polygonStyle}));
polygon_layer.addTo(map);
console.log(polygon_layer.getLayers()); // IS OK
});
};
console.log(polygon_layer.getLayers()); // IS EMPTY !!
那么,我如何才能转换这个匿名函数,以便能够从我的代码中访问哪些内容?
非常感谢,抱歉我的英语不太好......
答案 0 :(得分:5)
这是异步代码执行的典型问题。您的示例代码不会从上到下执行。特别是,在Shapefile
执行任何操作之前,您的匿名函数不会被执行。与此同时,您的JS按顺序执行。因此,上述代码的最后一行,可能在匿名函数之前执行。
要解决此问题,您需要在其回调中触发任何依赖于Shapefile
响应的代码:
for (var i = 0; i < SHP_files.length; i++) {
shapefile = new Shapefile({
shp: "shp/polygon/"+SHP_files[i]+".shp",
dbf: "shp/polygon/"+SHP_files[i]+".dbf",
}, function(data) {
polygon_layer.addLayer(new L.GeoJSON(data.geojson,{onEachFeature: onEachFeature, style: polygonStyle}));
polygon_layer.addTo(map);
executeMoreCode();
});
};
function executeMoreCode() {
console.log(polygon_layer.getLayers()); // IS OK
}
答案 1 :(得分:2)
尝试在for循环或函数之外定义变量,在本例中为polygon_layer。请参阅以下示例:
var f;
for(var i=0; i<5;i++){
(function(){
f = 10;
console.log(f); // Outputs 10
})();
}
console.log(f); // Also outputs 10