2012-02-02 30 views
0

我想讀取文件,執行一些操作,檢查動作模式。javascript - 循環中的多個settimeouts

如果mode = STOP,則延遲處理直到mode!= STOP,否則重複整個過程。

我希望它保持延遲,直到模式改變。

無限循環&瀏覽器崩潰的結果下面的代碼:

function fnIterateGeocode(addressVariations) { 

    // read a file & do some stuff 

    // check for delay 
    fnDelay(); 

    // if not end of file then Iterate 
    if (nextRecord.EOF != 'Y') { 
     setTimeout(function(){      
      fnIterateGeocode(addressVariations);       
     } 
     , 5000); 
    } 


    // if mode = STOP, then delay for 5 seconds and check again  

    function fnDelay(){ 
     if(mode == 'STOP'){ 
       setTimeout(function(){              
       } 
       , 5000); 
       fnDelay(); 
     } 
     return; 
    }   

    return; 
} 

回答

2

你把電話回fnDelay在錯誤的地方:

function fnDelay(){ 
    if(mode == 'STOP'){ 
      setTimeout(function(){ 
       // It should be here 
      } 
      , 5000); 
      fnDelay(); // Not here 
    } 
    return; 
} 

的方式你的代碼是當前寫入確實是一個無限循環(好吧,如果你沒有用完棧空間),因爲fnDelay總是立即自行調用。

+0

我希望它保持循環延遲,直到模式更改爲「開始」。 – 2012-02-02 17:30:59

+0

你的建議也不會達到任何效果,只需每5秒在自己的小循環中調用fnDelay(它什麼都不做)。實際上和'setInterval(function(){},5000)一樣'' – beeglebug 2012-02-02 17:33:08

+0

@beeglebug:我沒有爲他調試* rest *,只是解決了無限循環。我認爲有代碼沒有顯示。 – 2012-02-02 19:07:22

0

我不認爲你完全理解異步代碼。

沒有辦法的辦法「延遲」的JavaScript你想(像wait,或sleep其他語言)。對setTimeout的呼叫不會暫停執行,持續5秒。

嘗試將setTimeout作爲一個請求,將傳入的函數放入隊列中,以便將來在某個時刻調用該函數。完成後,腳本將立即進入下一行代碼,與其他任何函數調用一樣。

在你的榜樣,像下面這樣會更有意義:

function fnDelay(){ 
    if(mode != 'STOP'){ fnIterateGeocode(); } 
    else { setTimeout(fnDelay,5000); 
} 

這隻要它不只要mode == 'STOP'調用每5秒本身,它會調用fnIterateGeocode