js 实现睡眠
使用 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 环境。

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 直观。

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 的方式也值得考虑。避免使用忙等待等会阻塞线程的方法,除非在非常特殊的情况下。






