标准答案
- sleep(ms) 通常返回一个 Promise。
- 内部用 setTimeout 在 ms 毫秒后 resolve。
- await sleep(ms) 只暂停当前 async 函数的后续执行,不会阻塞浏览器主线程。
- 可以扩展为支持返回值、取消或超时控制。
- 使用时要避免在 UI 关键路径里制造不必要等待。
题目解析
sleep 是理解 Promise 和 async/await 的基础工具。它让代码看起来像同步等待,但底层仍然是定时器和异步回调。
它不等于阻塞线程。JavaScript 主线程仍然可以处理其他任务,只是当前 async 函数会在 Promise resolve 后继续往下走。
实际场景里 sleep 常用于轮询间隔、动画节奏、重试退避和测试等待。但如果用它掩盖状态同步问题,代码会变得脆弱。
代码示例
最小版本只需要包装 setTimeout。
JavaScript
function sleep(ms, value) {
return new Promise(resolve => {
setTimeout(() => resolve(value), ms)
})
}
async function run() {
await sleep(1000)
return 'done'
}常见误区
- 以为 await sleep 会阻塞整个页面,混淆了异步等待和线程阻塞。
- 忘记返回 Promise,导致调用方无法 await。
- 在业务逻辑里用固定 sleep 等接口或状态变化,造成偶发问题。