在寫 nodejs 時,有時候我們可能會需要寫定時執行的的功能或函式,但在 javascript 中是沒有 sleep() 函式的,因此這邊有幾種方式提供你實作 sleep()


 

例如:每三秒檢查一次資料

注意:前兩種寫法並不會 block 住目前的程式碼執行,而是設定定時器後,會再分時執行。
但第三種則會 block 住目前的程式碼執行,也代表若用在 UI thread,會使得目前頁面停頓而無法操作。

  1.  利用 setInterval(function, milliseconds),定時(微秒)執行函式
    setInterval(function(){
    console.log('check data');
    },3000);
    

    PS. 若需中止或停止需使用 clearInterval() 來取消設定

  2. 利用 setTimeout(function, milliseconds),一定時間(微秒)後執行此函式
    function check()
    {
    console.,log('check data');
    setTimeout(check, 3000);
    }
    

    PS. 若需中止或停止需使用 clearTimeout() 來取消設定

  3. 利用 無窮迴圈及目前時間,經過特定時間再跳出無窮迴圈。
    function sleep(milliseconds) 
    { 
    var start = new Date().getTime(); 
    while(1)
         if ((new Date().getTime() - start) > milliseconds)
              break;
    }
    while(1)
    {
         console.log('check data');
         sleep(3000);
    }
    

    PS. 通常大多數時候應該不會這樣做,會使得執行緒卡在無意義的程式碼中。
    或許有些應用的地方是需要確保程式碼執行的順序,那我們可以使用 callback(回呼函式)的寫法來達到相同的效果。


 

2017/02/01 更新

看到更好的 ES6 語法,利用這種寫法,就不用一直將要執行的 callback 丟進 setTimeout / setInterval


async function sleep(ms = 0) {
return new Promise(r => setTimeout(r, ms));
}

async function run() {
console.log("Before: " + (new Date()).toString());
await sleep(3000);
console.log("After: " + (new Date()).toString());
}

run();

 

參考資料:

http://trufflepenne.blogspot.tw/2011/09/javascriptsleep.html

Leave a Reply