js 实现 sleep 函数

460 阅读1分钟

相对于上一篇文章中的 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 执行完成,必须将 promiseresolve 放在 setTimeout 的回调中。 这种方法,需要将原本 sleep 调用之后需要运行的同步代码放在 thenonFulfilled 回调中

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()