Skip to content

[javascript] sleep()函數實作

Published: at 03:33 AM (3 min read)

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


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

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

  1. 利用 setInterval(function, milliseconds),定時(微秒)執行函式

    [javascript] setInterval(function(){ console.log(‘check data’); },3000); [/javascript]

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

  2. 利用 setTimeout(function, milliseconds),一定時間(微秒)後執行此函式

    [javascript] function check() { console.,log(‘check data’); setTimeout(check, 3000); } [/javascript]

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

  3. 利用 無窮迴圈及目前時間,經過特定時間再跳出無窮迴圈。

    [javascript] 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); } [/javascript]

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


2017/02/01 更新

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

[javascript]

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(); [/javascript]

參考資料:

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