手写sleep函数

956 阅读1分钟

前言

我们知道异步编程的难点之一阻塞代码,JavaScript没有原生的sleep()这样的线程沉睡功能,我们可以自己手写一个sleep函数,来达到延迟执行函数的方法,在《深入学习Node.js》一书中,提到遇见这种需求,调用setTimeout()效果最好,兼容性更佳。

方法一 直接使用setTimeout()

实现延迟自定时间后执行函数

function sleep(time, fn) {
  setTimeout(() => {
    fn()
  }, time)
}

方法二 Promise+setTimeout()

延迟一定时间后使Promise的PENDING状态转为FULFILLED,在用then()方法调用函数

const fn = function() {}

function sleep(time) {
  return new Promise((resolve) => {
    setTimeout(resolve, time)
  })
}

sleep(3000).then(fn())

方法三 async/await

和上面的思路一样,也是使用异步思想,不过这个函数是在内部运行的

async function sleep(time, fn) {
  await new Promise((resolve) => {
    setTimeout(resolve, time)
  })
  fn()
}

sleep(3000, fn)

结语

在网上还看到了第四种方法用Generator做也能解决,有兴趣的小伙伴可以自己研究一下