js实现睡眠
使用 setTimeout 和 Promise 实现睡眠
在 JavaScript 中,可以通过 setTimeout 结合 Promise 实现睡眠功能。这种方法利用了异步编程的特性,不会阻塞主线程。

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。这种方法会真正阻塞线程,适用于 Worker 线程环境。

function syncSleep(ms) {
const sharedArrayBuffer = new SharedArrayBuffer(4);
const view = new Int32Array(sharedArrayBuffer);
Atomics.wait(view, 0, 0, ms);
}
// 使用示例(注意:在主线程使用会冻结页面)
console.log('开始');
syncSleep(2000); // 同步等待2秒
console.log('结束');
使用 async/await 简化异步流程
结合 async/await 语法可以更清晰地组织需要睡眠的异步代码逻辑。
async function processWithSleep() {
console.log('步骤1');
await sleep(1000);
console.log('步骤2');
await sleep(1500);
console.log('完成');
}
processWithSleep();
注意事项
- 浏览器环境中的
setTimeout最小延迟通常为 4ms(即使设置为 0ms) - Node.js 环境从版本 16 开始支持
timers/promises模块的setTimeout直接返回 Promise - 同步睡眠会阻塞事件循环,网页中使用会导致界面冻结
- Worker 线程中可以使用更精确的
performance.now()配合循环实现忙等待(不推荐)
Node.js 专用方法
Node.js 15+ 版本可以直接使用 timers/promises 模块:
import { setTimeout } from 'timers/promises';
async function nodeSleep() {
console.log('开始');
await setTimeout(2000);
console.log('结束');
}
nodeSleep();






