标准答案

  1. sleep(ms) 通常返回一个 Promise。
  2. 内部用 setTimeout 在 ms 毫秒后 resolve。
  3. await sleep(ms) 只暂停当前 async 函数的后续执行,不会阻塞浏览器主线程。
  4. 可以扩展为支持返回值、取消或超时控制。
  5. 使用时要避免在 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 等接口或状态变化,造成偶发问题。

作者信息