sleep() 是用 promise 封装 settimeout 实现的异步等待函数,基本写法为 function sleep(ms) { return new promise(resolve => settimeout(resolve, ms)); },支持 await;增强版可传值:function sleep(ms, value = undefined) { return new promise(resolve => settimeout(() => resolve(value), ms)); };常见误用包括直接 return settimeout(返回定时器 id 而非 promise),注意事项有无需 catch(因无 reject)、注意 this 绑定;实际可用 window.sleep 挂载、promise.all 并行调用、sleep(0) 模拟微任务延迟。

在 JavaScript 中,可以用 Promise 封装 setTimeout 实现一个简洁的异步等待函数 sleep(),它返回一个 Promise,在指定毫秒后自动 resolve,从而支持 await 语法。
sleep() 的基本写法
核心是用 new Promise 包裹 setTimeout,在定时器完成时调用 resolve:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
这样写出来的 sleep() 可直接用于 async/await 流程中,比如:
async function example() {
console.log('开始');
await sleep(1000);
console.log('1 秒后执行');
}
支持传入值的增强版 sleep()
如果希望 await sleep(1000) 后拿到某个值(如返回的毫秒数或自定义数据),可以在 resolve 时传参:
function sleep(ms, value = undefined) {
return new Promise(resolve => setTimeout(() => resolve(value), ms));
}
使用示例:
const result = await sleep(500, 'done'); console.log(result); // 输出 'done'
常见误用与注意事项
-
不要在 Promise 外部 return setTimeout:直接写
return setTimeout(...)返回的是定时器 ID(数字),不是 Promise,无法 await。 -
避免 resolve 前抛错未处理:当前 sleep 不涉及 reject,所以无需
catch;但如果后续扩展为可取消,需考虑 reject 场景。 - 注意 this 绑定问题:普通函数写法无 this 依赖,箭头函数或类方法中使用时,确保上下文正确(一般不影响)。
实际开发中的小技巧
- 可以全局挂载:
window.sleep = sleep或模块导出export { sleep },方便多处复用。 - 配合
Promise.all实现并行延迟:await Promise.all([sleep(100), sleep(200)])。 - 调试时可用
sleep(0)模拟微任务延迟,让当前同步代码执行完再继续(类似queueMicrotask效果,但语义更清晰)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











