2016-04-04 19 views
0

YaniBunu, özyinelemeli işlev yerine döngüde nasıl değiştirebilirim?

  var barlen = $('#SSWEprogressbar').width(), 
       $elems = $('[data-srcurl]'), 
        k = 0, 
        n = $elems.length; 
      LoadImage(); 
      function LoadImage() 
      { 
       var $elem = $($elems[k]); 
       var img = new Image(), 
        url = $elem.attr('data-srcurl'); 
       $(img).load(function(){ 
       $('#SSWEloaderfront').attr('src',url); 
       $('#SSWEloadprogress').width((k+1)/n*barlen + "px"); 
        var srctgt = $elem.attr('data-srctgt'); 

        // change url to src attribute or background image of element 
        if (srctgt == "srcattr"){ $elem.attr('src',url); } 
        else if (srctgt == "bgimg") { $elem.css('background-image',"url("+url+")"); } 

        // decide whether to exit the 
        if (++k == n) { AllyticsSSWEPlayerShow(); } 
        else { LoadImage(); } 
       });     
       img.src = url; 
      } 

gibi bir kod parçası ve o load geri arama işlevi şeyler tekrar çalıştırılabilir önce çağrılması gerekir çünkü bu tarafta yazılı olması nedeni var. Mümkünse, bunu bir özyinelemeli işlevden bir döngüye değiştirmek istiyorum, ancak bunu nasıl yapacağımı bilmiyorum çünkü bir sonraki yinelemeye geçmeden önce for veya while döngü "wait" yapmanın bir yolu yoktur. Yoksa orada mı?

+0

HTML kodunuzu paylaşabilirsiniz? :) –

+0

neden bunu yapmak istiyorsun? Bu, JS'deki alışılmış kalıptır (bir versiyonu). – Alnitak

+0

@AralRoca – Alnitak

cevap

0

Açıklamada belirtildiği gibi, doğrudan işlevi çağırmak yerine else içinde setTimeout(LoadImage, 100); kullanarak sorununuzu kolayca çözebilirsiniz. 2. parametre ms cinsinden gecikme.

Neden setTimeout(LoadImage, 0);'un aptal olmadığını ve doğrudan işlevi çağırmakla aynı olmadığını düşünüyorsanız, setTimeout anladınız. Fonksiyon çağrısını sıraya koyar, bu, basılan tıklamalar veya tuşlar gibi diğer olayların tekrar çağrılmadan önce işlenebileceği ve ekranın donmadığı anlamına gelir. Bunun gibi maksimum tekrarlamaya ulaşmak da imkansızdır, derinlik 1'dir.

+0

Bu nasıl bir sorunu "çözmek" - OP onun “probleminin” ne olduğunu söylemedi ve her halükarda (amaçlanmadı) geri çağrının asenkron doğası zaten kodun sadece 'tekrarlayıcı-özyinelemeli' ve gerçekten özyineli olmadığı anlamına gelir. OP'nin orijinal kodu aynı zamanda "maksimum yineleme" ye ulaşamaz çünkü maksimum yineleme derinliği de aynı şekilde 1'dir. – Alnitak

+1

OP'den alıntı yapıyorum: * "... bir sonraki aşamaya geçmeden önce" süre "veya" while "döngüsü yapmanın bir yolu yoktur. yineleme ya da var mı? * * Evet bir yol var, 'setTimeout' kullanabilirsiniz ... – maraca

+0

OP bunu normal bir 'for' döngüsünü istediği gibi okudum ve açıklanamayan nedenlerle özyinelemeyi ortadan kaldırmış olarak okudum ve Kendisini bulamadığı için bulma çünkü forync, async işlevinin bitmesini beklemez. İnkâsyonlar arasında “yapay” bir gecikme istediğine inanmıyorum. – Alnitak

İlgili konular