当前位置:首页 > 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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现动画

js实现动画

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…