Javascript JS函数执行有问题

Javascript JS函数执行有问题,javascript,Javascript,我对JS函数的执行有点问题。 这就是代码: function CaricaImmagini() { //First for loop for (i = 0; i < tiles.length; i++) { tileGraphics[i] = new Image(); tileGraphics[i].src = tiles[i]; tileGraphics[i].onload = function()

我对JS函数的执行有点问题。 这就是代码:

function CaricaImmagini() {
    //First for loop
    for (i = 0; i < tiles.length; i++)
    {
        tileGraphics[i] = new Image();
        tileGraphics[i].src = tiles[i];

        tileGraphics[i].onload = function() 
        {
            img_loaded++;
            pda.SetPerc(Math.round((70/(tiles.length + img_nec.length))*img_loaded));
            pda.CounterFill();
        }   
    }
    //Second for loop
    for (i=0; i < img_nec.length; i++)
    {
        imgs[i] = new Image();
        imgs[i].src = img_nec[i];

        imgs[i].onload = function() 
        {
            img_loaded++;
            pda.SetPerc(Math.round((70/(tiles.length + img_nec.length))*img_loaded));
            pda.CounterFill();
        }
    }
    //Change % in Canvas
    pda.SetPerc(75);
    pda.CounterFill();
}
maimmagini()函数{
//循环优先
对于(i=0;i
问题在于,“画布中的更改百分比”注释下的函数是在for循环之前执行的。 因此在画布中我看到了第一个75%(setperc函数呈现%加载), 然后我看到这些计算的输出[数学圆((70/(tiles.length+img_nec.length))*img_loaded)]。 我怎样才能解决这个问题


在这方面,发生这种情况是因为
onload
事件会在稍后触发,只有在这之后才会执行您定义的回调。因此,函数末尾的行首先执行是正常的——这不会有任何不同

因此,只需将0%放在那里:

    //Change % in Canvas
    pda.SetPerc(0);
    pda.CounterFill();
然而,如果您希望在加载完所有代码后执行代码,那么请定义一个回调。你可以这样做:

function CaricaImmagini(callback) { // notice the parameter that must be passed
    // ...
    tileGraphics[i].onload = function() 
    {
        // ...
        if (img_loaded == tiles.length + img_nec.length && callback) callback(); 
    }
    // ...
    imgs[i].onload = function() 
    {
        // ...
        if (img_loaded == tiles.length + img_nec.length && callback) callback(); 
    }
}
然后通过将回调函数传递给该函数来调用该函数:

CaricaImmagini(function () {
    // all is loaded now
    //Change % in Canvas
    pda.SetPerc(75);
    pda.CounterFill();
});

以下是一种模式,可能会对您有所帮助:

var nr = 100;
var imgs = [];
var some_sources = ... // list of 100 sources
var imgs_loaded = 0;

for(var i = 0; i < nr; i++) {
   imgs[i] = new Image();
   imgs[i].src = some_sources[i];
   imgs[i].onload = function() {
      imgs_loaded++;
      if (imgs_loaded === nr) {  // when all pictures are loaded
         doSomethingElse();
      }
   }
}
var nr=100;
var-imgs=[];
var some_sources=…//100个来源清单
var imgs_加载=0;
对于(变量i=0;i

因此,让我们异步加载所有图片,在每次图像到达时检查是否已加载所有图像。如果在加载最后一张图片后最终为真,则调用另一个函数。

实际for循环在您提到的注释之前执行,但是在循环内部应用异步回调,并且每当加载图片时都会执行,在函数的同步处理完成之后,你希望结果是什么样的?加载所有这些图像时,您希望
setPerc()?根据您当前的数学,您似乎不希望它从0变为100。加载这些图像时,您希望起始值和最终值是多少?谢谢您的帮助,代码运行得非常完美,但我需要两个图像数组。所以再次感谢你的回答,希望能帮助别人。尊敬的,特别感谢您的帮助,代码非常适合我的项目。再次感谢您和所有其他帮助我的用户。问候,特别的