代码 JS中 `sleep` 方法的实现

2024-11-19 08:10:32 +0800 CST views 671

JS中 sleep 方法的实现

目录

  1. 需求介绍
  2. 实现一:通过死循环阻塞执行
  3. 实现二:基于定时器延时
  4. 实现三:基于 Promise 的定时器
  5. 场景示例:红绿灯循环
  6. 下节预告

需求介绍

我们需要一个 sleep 函数来暂停程序的执行,从而实现延时效果。可以通过传入参数设置延迟时间,如下所示:

console.log('执行')
sleep(1000)
console.log('1000ms后执行')

期望结果:前面的程序执行完成后,间隔 1 秒再执行后面的代码。本文将实现该 sleep 方法。


实现一:通过死循环阻塞执行

由于 JS 是单线程的,只要在 sleep 时间内让程序处于阻塞状态,就能延迟后续程序的执行:

const sleep = timer => {
  const curTime = Date.now()
  while (Date.now() < curTime + timer) {}
}

console.log('执行:', new Date())
sleep(1000)
console.log('1000ms后执行:', new Date())

此方法通过 Date 计算当前时间是否达到延时时间。如果没有达到,程序会进入 while 循环,从而阻塞后续代码执行,实现延时效果。

缺点:这种方式会导致 JS 主线程被阻塞,无法处理其他任务(如其他代码块的执行、DOM 渲染等)。使用时要谨慎,尤其是在需要并行处理任务的场景中。


实现二:基于定时器延时

通过 setTimeout 延迟代码执行,这种方式可以简单实现延时效果:

const sleep = (act, timer) => {
  setTimeout(act, timer)
}

const action = () => {
  console.log('1000ms后执行:', new Date())
}
console.log('执行:', new Date())
sleep(action, 1000)

这种方式需要将延时执行的代码作为参数传递,维护性较差,且难以直接控制同步流程。


实现三:基于 Promise 的定时器

通过 Promise,我们可以更加优雅地实现 sleep 功能:

const sleep = timer => {
  return new Promise(resolve => {
    setTimeout(resolve, timer)
  })
}

console.log('执行:', new Date())
sleep(1000).then(() => {
  console.log('1000ms后执行:', new Date())
})

使用 Promise 可以更灵活地处理异步流程。为了提高代码可读性,还可以结合 async/await 语法糖:

const sleep = timer => {
  return new Promise(resolve => {
    setTimeout(resolve, timer)
  })
}

const action = async () => {
  console.log('执行:', new Date())
  await sleep(1000)
  console.log('1000ms后执行:', new Date())
}
action()

这种方式让异步代码的可读性和可维护性大大提升。


场景示例:红绿灯循环

我们来实现一个红绿灯循环:红灯 15 秒、绿灯 15 秒、黄灯 2 秒。

const sleep = timer => {
  return new Promise(resolve => {
    setTimeout(resolve, timer)
  })
}

const lightList = ['red', 'green', 'yellow']
const action = async index => {
  switch (lightList[index]) {
    case 'red':
      console.log('当前是 红灯 ', new Date())
      await sleep(15000)
      break
    case 'green':
      console.log('当前是 绿灯 ', new Date())
      await sleep(15000)
      break
    case 'yellow':
      console.log('当前是 黄灯 ', new Date())
      await sleep(2000)
      break
  }
  index = (index + 1) % 3
  action(index)
}
action(0)

images

在这个例子中,红灯、绿灯和黄灯依次循环,程序会根据不同的灯色等待相应的时间。

复制全文 生成海报 JavaScript 编程 异步编程

推荐文章

CSS 实现金额数字滚动效果
2024-11-19 09:17:15 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
js函数常见的写法以及调用方法
2024-11-19 08:55:17 +0800 CST
pip安装到指定目录上
2024-11-17 16:17:25 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
ElasticSearch简介与安装指南
2024-11-19 02:17:38 +0800 CST
实现微信回调多域名的方法
2024-11-18 09:45:18 +0800 CST
防止 macOS 生成 .DS_Store 文件
2024-11-19 07:39:27 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
Rust开发笔记 | Rust的交互式Shell
2024-11-18 19:55:44 +0800 CST
Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
如何使用go-redis库与Redis数据库
2024-11-17 04:52:02 +0800 CST
ElasticSearch集群搭建指南
2024-11-19 02:31:21 +0800 CST
JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
Go 语言实现 API 限流的最佳实践
2024-11-19 01:51:21 +0800 CST
程序员茄子在线接单