2014-08-29 65 views
1

我花了很多的這個時候對這個問題裏面沒有效果,最後我可以給它一個容易的jsfiddle閱讀代碼:http://jsfiddle.net/Lb0g25ae/While循環,增加變量具有setimeout功能

function test(i) { 
    return function() { 
     console.log(i); 
     //I need to increase valid here because this is where the script will choose wheter to increase or not (continue looping) valid depending on some conditions 
    } 
} 

var valid = 0; 
while (valid < 5) { 
    setTimeout(test(valid), 1000*valid); 
    valid++; 
} 

而且我需要它是

function test(i) { 
    return function() { 
     console.log(i); 
     valid++; 
    } 
} 

var valid = 0; 
while (valid < 5) { 
    setTimeout(test(valid), 1000*valid); 
} 

但這樣的循環不會停止,因爲有效的不被增加,這將產生一個無限循環和崩潰。有人可以指出我正確的方向?

回答

3

有效不會增加,因爲while循環不停並立即重載cpu。

您需要在超時後調用測試。檢查:

var valid = 0; 
function test() { 
    console.log(valid); 
    valid++; 
    if(valid < 5){ 
     setTimeout(test, 1000*valid); 
    } 
} 
test(); 
+0

另外,如果您需要返回一個值,因爲它看起來像您可能正在嘗試執行的操作,請嘗試使用回調樣式,因爲此答案解釋了一下:http://stackoverflow.com/a/7142064/1981678 – briansol 2014-08-29 16:03:15

+0

你真的做了我的一天!現在我想了解這些代碼的工作原理。這是一個遞歸函數嗎?非常感謝你的幫助,你解決了一個非常大的問題:) – 2014-08-29 16:07:58

+0

是的,它執行自己,所以它是遞歸的。 – gorpacrate 2014-09-01 07:10:52

0

有效的變量必須是全球性的,所以試試這個

var valid = 0; 
function test(i) { 
    return function() { 
     console.log(i); 
     window.valid++; 
    } 
} 


while (valid < 5) { 
    setTimeout(test(valid), 1000*valid); 
} 
+0

謝謝,但它是崩潰 – 2014-08-29 15:55:51

+0

您的聲明在技術上是正確的,但該變量已經是全球性的。 test()內'valid'的引用已經引用了全局變量。 – BudgieInWA 2014-08-29 15:58:46

0

的這裏的問題是,while循環必須運行到完成前的任何超時都可以運行。也就是說,valid不會遞增,直到第二過去了,沒有任何其他的代碼運行,但永遠不會發生,因爲while循環將仍然運行...

您需要安排內部的以下超時測試功能。