1. implement sleep()
下面這段程式碼會先印出 Hello,停 2 秒之後再印出 World, after 2 seconds!。
async function demo() {
console.log("Hello");
// Pause execution for 2000 milliseconds (2 seconds)
await sleep(2000);
console.log("World, after 2 seconds!");
}
demo();
但 JavaScript 並沒有內建的 sleep()。請你實作它,讓上面這段程式碼能如預期運作。
需求
sleep(ms)接受一個毫秒數。- 在
await期間不可以阻塞主執行緒(不能用 busy-wait 的 while 迴圈)。 - 不使用任何第三方函式庫。
預期輸出
+ 0ms Hello + 2000ms World, after 2 seconds!
延伸討論
- 如果連續
await sleep(1000)三次,總共會等多久?如果改成Promise.all()呢? - 為什麼
await不會卡住畫面?此時 event loop 在做什麼? - 如何讓
sleep()可以被取消(cancel)?試著支援AbortSignal。 setTimeout(fn, 2000)保證正好 2000ms 觸發嗎?什麼情況下會更久?
按「執行」開始,輸出會標示相對時間,方便確認真的等了 2 秒。