当前位置:首页 > JavaScript

js实现sleep暂停

2026-04-07 10:48:27JavaScript

使用 Promise 和 setTimeout 实现 sleep

JavaScript 本身没有内置的 sleep 函数,但可以通过 PromisesetTimeout 模拟实现。

js实现sleep暂停

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

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

使用 Generator 函数实现 sleep

通过 Generator 函数和 yield 也可以实现类似效果。

js实现sleep暂停

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

// 使用示例
async function demo() {
  console.log('开始');
  await sleepGenerator(2000).next().value;
  console.log('结束');
}
demo();

同步阻塞式 sleep(不推荐)

这种方法会阻塞整个线程,不建议在实际项目中使用。

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

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

使用 Atomics.wait 实现 sleep

现代浏览器中可以使用 Atomics API 实现更精确的等待。

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

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

注意事项

  • 异步方法不会阻塞事件循环,适合大多数场景
  • 同步方法会完全阻塞 JavaScript 执行线程
  • 在生产环境中推荐使用 Promise 方案
  • Node.js 环境也可以使用上述方法

标签: jssleep
分享给朋友:

相关文章

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现上传文件

js实现上传文件

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

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js实现div隐藏

js实现div隐藏

使用CSS的display属性隐藏div 通过设置元素的display属性为none,可以完全隐藏div元素。这种方法不仅隐藏元素,还会从文档流中移除,不占据页面空间。 document.getEl…

js实现表单验证提交表单提交表单提交

js实现表单验证提交表单提交表单提交

表单验证与提交的实现 在JavaScript中实现表单验证并提交表单,可以通过监听表单的提交事件,进行验证后决定是否提交。以下是实现方法: 基础表单验证 通过监听表单的submit事件,阻止默认提交…