因爲Javascript是單線程和事件驅動的,只要你的while循環運行,setInterval()
永遠不會觸發,它的回調將永遠不會被調用。所以你有一個死循環,你的while循環會永遠運行。
由於Javascript的事件驅動特性,setInterval()
將事件放入事件隊列中,但由於您的循環從不停止運行,解釋器永遠不會達到它可以真正完成當前的JS執行線程的程度,將下一個事件拉出事件隊列以運行定時器回調。
您不能使用while
循環等待其他事件發生。在Javascript中,除非while
循環本身完成,否則其他事件不會發生。相反,您只需要使用定時器,並且不需要使用while
循環。如果您可以更清楚地解釋您想要解決的實際問題,我們可以提供一種編碼解決方案。
要在這裏添加錯誤的東西,您需要每次通過while循環創建一個新的setInterval()
計時器(這樣他們就會堆積無數的計時器),這樣也會搞砸了。
你不完全說你正在努力完成什麼,但看起來你只能使用間隔計時器,而不能使用while
循環。因此,假設你要運行一些操作150次,間隔500毫秒之餘,你可以這樣做:
var count = 0;
var commentLoop = 150;
var timer = setInterval(function() {
// regular code here
// check if we're done repeating
if (count === commentLoop - 1) {
// stop the timer
clearInterval(timer);
} else {
count++;
}
}, 500);
或者,這可能進入一個效用函數(你可以運行這段代碼,看看它的工作):
function repeat(numTimes, delay, fn) {
var cntr = 0;
var timer = setInterval(function() {
if (cntr >= numTimes) {
clearInterval(timer);
} else {
// if callback returns true, then stop the timer
if (fn(cntr) === true) {
clearInterval(timer);
}
++cntr;
}
}, delay);
}
// sample usage
repeat(5, 400, function(cnt) {
console.log(cnt);
});
不能中斷循環。異步代碼不是先發制人的,所以它必須等到循環結束才能運行。 – 2016-07-30 17:38:47
請參閱[什麼是XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – 2016-07-30 17:44:58