2014-01-20 43 views
1

循環我有這樣的代碼:的JavaScript擺脫與超時

$(function(){ 
    var steps = ["download","unpack","install","installed"]; 
    for(var i = 1; i <= steps.length; i++){ 
     setTimeout(function(){ 
      if(updater(steps[i]) === false) break; // if update fails 
      else{ 
       var progress = (i/steps.length) * 100; 
       $("div#update div.progress div.progress-bar").animate({ 
        width : progress+"%" 
       }).attr("aria-valuenow", progress); 
      } 
     , 5000) 
    } 
    if(steps.length === i){ // update is fully installed 
     alertBox("success", "Congratulations, a new version of the SocialTab 3 has been installed.", 31556952000); 
    } 
    else{ // update failed 
     alertBox("error", "<p>Update failed!</p><p>"+updateError+"</p>", 31556952000); 
    } 
}); 

當我這樣做,我不能使用break,因爲它應該被用在for循環,這不是因爲我把它放在setTimeout函數中。 我想知道如何擺脫for循環,並仍然延遲setTimeout函數中的代碼。

回答

2

試試這個:

$(function(){ 
    function StepUpdate(step) 
    { 
     var steps = ["download","unpack","install","installed"]; 

     if (steps[step] != undefined) 
     { 
      setTimeout(function(){ 
       if(updater(steps[step]) === true) 
       { 
        var progress = (step/steps.length) * 100; 
        $("div#update div.progress div.progress-bar").animate({ 
         width : progress+"%" 
        }).attr("aria-valuenow", progress); 
        StepUpdate(step + 1); 
       } 
       else 
       { 
        // update failed 
        alertBox("error", "<p>Update failed!</p><p>"+updateError+"</p>", 31556952000); 
       } 
      }, 5000); 
     } 
     else 
     { 
      alertBox("success", "Congratulations, a new version of the SocialTab 3 has been installed.", 31556952000); 
     } 
    } 

    StepUpdate(0); 
}); 

沒有測試它。

+0

謝謝,就像一個魅力的工作! – SheperdOfFire

+0

我不能給你打倒那個暱稱...所以我做到了:) – bgusach

+0

@ ikaros45哈哈傻暱稱,確實如此。 – DontVoteMeDown

0

你可以做到這一點使用遞歸函數,就像這樣:

var steps = ["download","unpack","install","installed"]; 

function doUpdate(index) { 
    if(updater(steps[index]) === false) { 
     alertBox("error", "<p>Update failed!</p><p>"+updateError+"</p>", 31556952000); // if update fails 
    } 
    else{ 
     var progress = (index/steps.length) * 100; 
     $("div#update div.progress div.progress-bar").animate({ 
      width : progress + "%" 
     }).attr("aria-valuenow", progress); 
    } 

    if(steps.length === i) { 
     // update is fully installed 
     alertBox("success", "Congratulations, a new version of the SocialTab 3 has been installed.", 31556952000); 
    } 
    else { 
     doUpdate(index + 1) 
    } 
} 

doUpdate(0);