2016-03-24 28 views
2

JS İşlev Yürütme ile ilgili bir sorunum var. Bu kod:JS işlev yürütme ile ilgili sorun

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(); 
} 

sorun comment 'Canvas Değişim%' başlığı altında fonksiyonlar döngüler için önce çalıştırılan olmasıdır. Tuvalde ilk% 75'i görüyorum (setperc işlevi% yükleniyor), ve bundan sonra bu Calc [Math.round ((70/(tiles.length + img_nec.length)) * çıkışını görüyorum. Img_loaded)]. Nasıl çözebilirim?

Selamlar, 50Special

onload olaylar daha sonra tetiklenir ve ancak o zaman tanımladığınız geri aramalar çalıştırılacaktır Bunun nedeni
+0

Döngüler için, bahsettiğiniz yorumdan önce yürütülür, ancak döngüler içinde, eşzamansız geri aramalar uygularsınız ve resimler yüklendiğinde ve işlevlerin senkronize işlenmesinden sonra kesinlikle yürütülürler. –

+0

Sonuçların nasıl görünmesini istersiniz? Tüm bu görüntüleri yüklerken 'setPerc()' ın ne yapmasını istiyorsunuz? Mevcut matematiğinize dayanarak, 0'dan 100'e gitmek istemediğinize benziyor. Bu görüntüler yüklenirken başlangıç ​​ve son değerin ne olmasını istiyorsunuz? – jfriend00

cevap

1

. Böylelikle, fonksiyonunuzun sonundaki satırların ilk önce çalıştırılması normaldir - farklı olamazdı. Bir zamanlar tüm yüklendikten kod icra edilmesini isteyen ancak

//Change % in Canvas 
    pda.SetPerc(0); 
    pda.CounterFill(); 

, daha sonra geri arama tanımlarsanız:

Yani sadece orada% 0 koydu. Böyle yapabileceğini:

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(); 
    } 
} 

Daha sonra bunu geri çağırma işlevi geçirerek bu işlevi çağırır: Burada

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

Yardımınız için teşekkürler, kod projem için mükemmel çalışıyor. Size ve diğer tüm kullanıcılara yardımcı olduğunuz için tekrar teşekkür ederim. Saygılarımızla, 50Özel – 50Special

1

bir şablon, size yardımcı olabilir:

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(); 
     } 
    } 
} 

Bu yüzden, tüm resimler zaten yüklüyse, resimlerin her seferinde kontrol edilip edilmediğini tüm resimlerin eşzamansız olarak yükleyelim. Son fotoğraf yüklendikten sonra bu son olarak doğruysa, başka bir işlev çağrılır.

+0

Yardımlarınız için teşekkürler, Kod kusursuz çalışıyor, ancak iki resim dizisine ihtiyacım var. Cevabınız için tekrar teşekkürler, umarım başkalarına yardım edebilirsin. Saygılarımızla, 50Özel – 50Special