当前位置:首页 > JavaScript

js 实现睡眠

2026-02-01 01:31:01JavaScript

使用 Promise 和 setTimeout 实现睡眠

通过 Promise 和 setTimeout 结合的方式可以模拟同步的睡眠效果。这种方式不会阻塞整个线程,但可以在异步函数中实现类似同步的等待效果。

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

// 使用示例
async function demo() {
  console.log('开始等待');
  await sleep(2000);  // 等待2秒
  console.log('等待结束');
}
demo();

使用 Atomics.wait 实现真正的线程阻塞

如果需要真正的线程阻塞(不推荐在主线程使用,可能导致页面无响应),可以使用 Atomics.wait。这种方法通常用于 Web Worker 环境。

js 实现睡眠

function sleep(ms) {
  const sharedArrayBuffer = new SharedArrayBuffer(4);
  const sharedArray = new Int32Array(sharedArrayBuffer);
  Atomics.wait(sharedArray, 0, 0, ms);
}

// 使用示例
console.log('开始阻塞');
sleep(2000);  // 阻塞2秒
console.log('阻塞结束');

使用 Generator 函数实现睡眠

通过 Generator 函数和 yield 也可以实现类似睡眠的效果,虽然不如 async/await 直观。

js 实现睡眠

function* sleepGenerator(ms) {
  yield new Promise(resolve => setTimeout(resolve, ms));
}

// 使用示例
const sleep = sleepGenerator(2000);
sleep.next().value.then(() => {
  console.log('等待2秒后执行');
});

使用 Date 对象实现忙等待(不推荐)

通过循环检查时间差来实现睡眠,这种方式会占用CPU资源,不推荐在实际项目中使用。

function sleep(ms) {
  const start = Date.now();
  while (Date.now() - start < ms) {}
}

// 使用示例
console.log('开始忙等待');
sleep(2000);  // 忙等待2秒
console.log('忙等待结束');

在 Node.js 环境下的额外方法

Node.js 提供了 util 模块的 promisify 方法,可以将 setTimeout 转换为返回 Promise 的形式。

const { promisify } = require('util');
const sleep = promisify(setTimeout);

// 使用示例
async function demo() {
  console.log('Node.js 等待开始');
  await sleep(2000);
  console.log('Node.js 等待结束');
}
demo();

最佳实践建议

对于大多数应用场景,推荐使用第一种 Promise 和 setTimeout 结合的方式。这种方法兼容性好,不会阻塞主线程,且代码简洁明了。在 Node.js 环境中,util.promisify 的方式也值得考虑。避免使用忙等待等会阻塞线程的方法,除非在非常特殊的情况下。

标签: 睡眠js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…