2016-07-30 123 views
0

我想製作一個JSFiddle,但代碼崩潰了你的標籤頁/窗口......這個while循環出了什麼問題?它看起來是對的...JavaScript - 這個while循環有什麼問題?永不結束

var commentLoop = 150; 
    var whileLoop = true; 
    var count = 0; 

    while (whileLoop === true) { 
     setInterval(function() { 
      console.log("my regular code goes here"); 
      if (count == commentLoop - 1) { 
       console.log("just entered while loop thing"); 
       whileLoop = false; 
      } 
      count++; 
     }, 500); 
    } 

我錯過了什麼?謝謝您的幫助。

+1

不能中斷循環。異步代碼不是先發制人的,所以它必須等到循環結束才能運行。 – 2016-07-30 17:38:47

+1

請參閱[什麼是XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – 2016-07-30 17:44:58

回答

1

因爲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); 
 
});

+0

在此擴展,只傳遞給'setInternal'的回調函數循環完成後,哪些不會發生。 –

+0

添加代碼示例。 – jfriend00