2017-08-15 84 views
0

有沒有辦法暫停for循環,直到變量爲真?舉例來說,如果我有這個代碼,有什麼辦法暫停for循環,直到變量爲真

var flag = false; 
for(var i = 0; i < 15; i++){ 
    console.log(i); 
} 

i等於7,我可以暫停循環,直到flag = true

謝謝!

+3

不......聽起來像你試圖解決問題的錯誤的方式。你爲什麼要暫停循環? – tymeJV

+0

你可以看看承諾,得到解決,然後在循環內開始等待這個承諾,當我== 7:https://developers.google.com/web/fundamentals/getting-started/primers/promises – Dimitri

+0

@tymeJV我' m製作Simon Game,我不想讓我的循環繼續,直到用戶點擊某些按鈕。 – stephenpassero

回答

6

JavaScript是一個基於事件的單線程模型。如果您暫停執行,則無法在此期間評估您的旗幟。

相反,您應該退出循環,捕獲更改標誌的事件,並在您離開它的位置回到循環。

例如:

var flag = false; 
 
for (var i = 0; i < 15; i++) { 
 
    console.log(i); 
 
    // the following makes no sense, it is just an example 
 
    if (i === 7) { 
 
    break; 
 
    } 
 
} 
 

 
document.getElementById('my_button').onclick = function(e) { 
 
    i++; 
 
    for (i; i < 15; i++) { 
 
    console.log(i); 
 
    // it starts where you left it 
 
    } 
 
}
<div id="my_button">Click me!</div>

+0

好的...我會試試。 – stephenpassero

+0

有沒有辦法重新進入循環,而沒有爲同一個變量創建一個新的循環? – stephenpassero

+0

你爲什麼想這樣做?使用相同的變量是IMO的最佳選擇。 – David

0

編號A循環將執行,直到條件爲真。

1

您可以使用超時間隔來模擬循環並更改flag

function count(start, end, inc) { 
 
    var i = start; 
 
    return function() { 
 
     if (i === 8 && ! flag) { 
 
      return;   
 
     } 
 
     console.log(i); 
 
     i += inc;   
 
     if (i >= end) { 
 
      clearInterval(interval); 
 
     } 
 
    } 
 
} 
 

 

 
var flag = false, 
 
    interval = setInterval(count(0, 10, 1), 500); 
 

 
setTimeout(function() { 
 
    flag = true; 
 
}, 10000);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

OP表示,直到變量爲真,如何10000毫秒,直到?說實話,他應該使用Observable模式。讓循環運行到第7次迭代,觀察將標誌設置爲真的事件,然後從第8次起繼續迭代 –

0

試試這個

var flag = false; 
for(var i = 0; i < 15; i++){ 
    If ((i > 6) && (! flag)){ 
     i = 6; 
    } else { 
     console.log(i); 
    } 
} 

這將作出一個無限循環,但我想你知道如何&,其中標誌將是真實的,可能是語法是不正確的,但我給你的想法是如何暫停一個循環...

0

ES6有一些東西叫做發電機,可能對你有所幫助。這不是for循環,但可以「暫停」你的腳本。 在這裏閱讀更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

function* idMaker() { 
 
    let index = 0; 
 
    while (index < 15) { 
 
    yield index++; 
 
    } 
 
} 
 

 
var gen = idMaker(); 
 

 
//console.log(gen.next().value); 
 
//console.log(gen.next().value); 
 

 
for (i of gen) { 
 
    if (gen.next().done) { 
 
    console.log('all done'); 
 
    } else { 
 
    console.log(i); 
 
    } 
 
}