如何将其更改为循环而不是递归函数?

时间:2016-04-04 20:42:38

标签: javascript jquery algorithm

所以我有一段像

这样的代码
          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;
          }

我之所以这样写的原因是因为需要调用load回调才能再次执行函数中的东西。如果可能的话,我想将它从递归函数更改为循环,但我不知道如何做到这一点,因为无法使forwhile循环“等待”在继续下一次迭代之前。或者有吗?

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您可以使用setTimeout(LoadImage, 100);中的else轻松解决问题,而不是直接调用该函数。第二个参数是以ms为单位的延迟。

如果你理解为什么setTimeout(LoadImage, 0);不是愚蠢的,而不是直接调用函数那么你理解setTimeout。它将函数调用放入队列中,这意味着可以在再次调用函数之前处理其他事件,如按下的单击或按键,并且屏幕不会冻结。像这样达到最大递归也是不可能的,深度是1。