当前位置:首页 > 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="slider-container"> <div class="slid…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…