2016-11-23 65 views
2

我似乎無法得到超時和循環一起工作。如果我刪除循環它的工作,或者如果我刪除超時它將工作。在一起我會得到一個infinit循環,並且它看起來不像超時函數在while循環內部運行。

任何幫助,將不勝感激!

function doTask (list) { 
    if (list) { 
     while (list.length > 0) { 
      (function(list){ 
       $timeout(function() { 
        list.splice(0, 1); 
        console.log("timeout...") 
       }, 5000); 
      })(list); 
     } 
    } 
} 
+1

那是因爲你改變setTimeout的長度將5秒之後被調用,但將土地漲不獲取調用爲您的代碼將永遠不會出來循環 – Rajesh

+0

你真的想才達到什麼的? – Sandeeproop

+0

我想循環,直到列表爲空,但延遲循環。 –

回答

4

您應該使用遞歸循環。此外,你應該檢查list.length[]是一個真正的價值。

function doTask(list) { 
 
    if (list.length) { 
 
    setTimeout(function() { 
 
     list.splice(0, 1); 
 
     console.log("timeout...") 
 
     doTask(list); 
 
    }, 500); 
 
    } 
 
} 
 
var list = [1,2,3,4,5] 
 
doTask(list);

+0

完美!謝謝! –

2

你的代碼永遠不會讓機會運行超時功能。

當doTask被調用時,它會進入堆棧運行。現在在每個循環迭代中,您正在註冊一個超時,該任務將在此任務結束時執行。但是你從來沒有給出超時運行的機會,因此列表的長度永遠不會減少,這就是爲什麼它永遠在運行。

希望這能夠澄清您的查詢。