循环中的javascript onload事件

循环中的javascript onload事件,javascript,jquery,loops,asynchronous,onload,Javascript,Jquery,Loops,Asynchronous,Onload,我试图循环浏览一个json图像数组,将图像添加到地图上的标记中。由于javascript是异步的,这会给我带来问题,所以我希望在将图像添加到地图之前等待图像加载,并且无法在循环完成之前加载图像。这是可能实现的,因为我尝试使用回调实现,但无法使其工作 for (var i = 0; i < jsonObj.potholes.length; i++) { var image = new Image(); image.src = "dat

我试图循环浏览一个json图像数组,将图像添加到地图上的标记中。由于javascript是异步的,这会给我带来问题,所以我希望在将图像添加到地图之前等待图像加载,并且无法在循环完成之前加载图像。这是可能实现的,因为我尝试使用回调实现,但无法使其工作

 for (var i = 0; i < jsonObj.potholes.length; i++)
 {  
      var image = new Image();



                image.src = "data:image/png;base64," + jsonObj.potholes[i].image;
                image.onload = function()
                {
                    //alert("image loaded");
                    EXIF.getData(image, function()
                    {
                        otn = parseInt(EXIF.getTag(image, "Orientation"));
                        dataURL = drawCanvas(otn, image).toDataURL();

                        var circle = L.circle([jsonObj.potholes[i].lat, jsonObj.potholes[i].lon], 18, {
                            color: 'yellow',
                            fillColor: 'red',
                            fillOpacity: 0.5
                        }).addTo(markersLayerGroup).bindPopup("Pothole ID " + jsonObj.potholes[i].id
                                + "<br />Location " + city[i] + "," + street[i] +
                                "<image src = '" + dataURL + "'></image>");


                    });



}
for(var i=0;i位置“+城市[i]+”,“+街道[i]+
"");
});
}

您应该实现一个异步循环(如果
,则使用
):

(函数(ondone){
var指数=0;
下一步();
函数nextStep(){
如果(索引>=jsonObj.pottholes.length){
如果(ondone)
ondone();
返回;
}
var i=指数++;
var image=新图像();
image.src=“data:image/png;base64,”+jsonObj.pottholes[i]。image;
image.onload=函数(){
//警报(“图像加载”);
EXIF.getData(图像、函数(){
otn=parseInt(EXIF.getTag(图像,“方向”);
dataURL=drawCanvas(otn,图像).toDataURL();
var circle=L.circle([jsonObj.pottholes[i].lat,jsonObj.pottholes[i].lon],18{
颜色:'黄色',
fillColor:'红色',
填充不透明度:0.5
}).addTo(markersLayerGroup).bindPopup(“凹坑ID”+jsonObj.pottholes[i].ID
+“
位置“+城市[i]+”,“+街道[i]+ ""); 下一步(); }); } } })(函数(){alert(“Done!”;});

您也可以使用承诺,例如:。

希望不要太晚。还有一个更简单的解决方案——将所有内容都放到另一个函数中

for (var i = 0; i < jsonObj.potholes.length; i++) {  
    dataOnLoad("data:image/png;base64," + jsonObj.potholes[i].image);
}
function dataOnLoad(base64_data) {
    var image = new Image();
    image.src = base64_data;
    image.onload = function()
    {
        //alert("image loaded");
        EXIF.getData(image, function()
        {
            otn = parseInt(EXIF.getTag(image, "Orientation"));
            dataURL = drawCanvas(otn, image).toDataURL();

            var circle = L.circle([jsonObj.potholes[i].lat, jsonObj.potholes[i].lon], 18, {
                color: 'yellow',
                fillColor: 'red',
                fillOpacity: 0.5
            }).addTo(markersLayerGroup).bindPopup("Pothole ID " + jsonObj.potholes[i].id
                    + "<br />Location " + city[i] + "," + street[i] +
                    "<image src = '" + dataURL + "'></image>");


        });
}
for(var i=0;i位置“+城市[i]+”,“+街道[i]+
"");
});
}
for (var i = 0; i < jsonObj.potholes.length; i++) {  
    dataOnLoad("data:image/png;base64," + jsonObj.potholes[i].image);
}
function dataOnLoad(base64_data) {
    var image = new Image();
    image.src = base64_data;
    image.onload = function()
    {
        //alert("image loaded");
        EXIF.getData(image, function()
        {
            otn = parseInt(EXIF.getTag(image, "Orientation"));
            dataURL = drawCanvas(otn, image).toDataURL();

            var circle = L.circle([jsonObj.potholes[i].lat, jsonObj.potholes[i].lon], 18, {
                color: 'yellow',
                fillColor: 'red',
                fillOpacity: 0.5
            }).addTo(markersLayerGroup).bindPopup("Pothole ID " + jsonObj.potholes[i].id
                    + "<br />Location " + city[i] + "," + street[i] +
                    "<image src = '" + dataURL + "'></image>");


        });
}