我怎样才能把它变成一个循环,而不是一个递归函数

How can I change this into a loop instead of a recursive function?

本文关键字:一个 循环 递归函数      更新时间:2024-01-14

所以我有一段类似的代码

          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循环"等待"。还是有?

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

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