相对于上一篇文章中的 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()