在寫 nodejs 時,有時候我們可能會需要寫定時執行的的功能或函式,但在 javascript 中是沒有 sleep() 函式的,因此這邊有幾種方式提供你實作 sleep()
例如:每三秒檢查一次資料
注意:前兩種寫法並不會 block 住目前的程式碼執行,而是設定定時器後,會再分時執行。 但第三種則會 block 住目前的程式碼執行,也代表若用在 UI thread,會使得目前頁面停頓而無法操作。
-
利用 setInterval(function, milliseconds),定時(微秒)執行函式
[javascript] setInterval(function(){ console.log(‘check data’); },3000); [/javascript]
PS. 若需中止或停止需使用 clearInterval() 來取消設定
-
利用 setTimeout(function, milliseconds),一定時間(微秒)後執行此函式
[javascript] function check() { console.,log(‘check data’); setTimeout(check, 3000); } [/javascript]
PS. 若需中止或停止需使用 clearTimeout() 來取消設定
-
利用 無窮迴圈及目前時間,經過特定時間再跳出無窮迴圈。
[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