相对于上一篇文章中的 LazyMan
的实现,实现一个 sleep
函数简直小菜一碟。
按照网上给出的定义:sleep
函数作用是让线程休眠,等到指定时间在重新唤起。
循环判断
我看了网上给出的一些答案,个人认为真正实现在同步代码中调用一下 sleep
函数就能休眠的只有一种方法,就是用同步的循环不断的判断等待的时间到了没。
function sleep(time) {
let start = new Date()
while (new Date - start <= time) {}
}
let t1 = new Date()
sleep(1000)
let t2 = new Date()
console.log(t2 - t1)
直接使用 setTimeout
等待指定时间,那显然也可以用 setTimeout
。
这种方法,显然必须传入原本 sleep
调用之后需要运行的同步代码。
function sleep(fn, time) {
setTimeout(fn, time)
}
sleep(() => {
console.log(1000)
}, 1)
使用 promise
要等待 setTimeout
执行完成,必须将 promise
的 resolve
放在 setTimeout
的回调中。 这种方法,需要将原本 sleep
调用之后需要运行的同步代码放在 then
的 onFulfilled
回调中
function sleep(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, time)
})
}
let t1 = new Date()
sleep(1000).then(() => {
let t2 = new Date()
console.log(t2 - t1)
//do something...
})
使用 async & await
async & await
的版本本质与 promise 是一样的。
function sleep(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, time)
})
}
async function fn() {
let t1 = new Date()
await sleep(1000)
let t2 = new Date()
console.log(t2 - t1)
//do something
}
fn()