sleep函数核心是封装promise与settimeout,基础版直接返回延时resolve的promise;支持abortsignal取消;可组合重试逻辑实现轮询节拍控制。

用 async/await 写睡眠函数,核心是封装一个基于 Promise 和 setTimeout 的延迟工具,让它既简洁又可复用。
基础版 sleep:最小可用实现
最直接的方式是返回一个在指定毫秒后 resolve 的 Promise:
- 不依赖外部库,纯原生 JS
- 调用时用
await sleep(1000)表示等待 1 秒 - 注意:它只暂停当前 async 函数的执行,不影响主线程其他任务
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
支持取消的 sleep:避免无意义等待
真实场景中,可能需要中途取消等待(比如用户切换页面、请求被中止)。可以借助 AbortSignal 实现可取消的 sleep:
- 传入
AbortSignal,监听abort事件提前 reject - 被取消时抛出
DOMException: AbortError,可用try/catch捕获 - 适合与
fetch、React Suspense 或状态管理配合使用
function sleep(ms, signal) {
return new Promise((resolve, reject) => {
if (signal?.aborted) return reject(new DOMException('Aborted', 'AbortError'));
const timeoutId = setTimeout(resolve, ms);
signal?.addEventListener('abort', () => {
clearTimeout(timeoutId);
reject(new DOMException('Aborted', 'AbortError'));
});
});
}
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
带重试逻辑的 sleep:用于轮询或降级等待
有时 sleep 不是独立存在,而是嵌套在重试机制里。可以组合成一个“等待并重试”的小工具:
- 例如轮询接口直到返回成功结果,每次失败后 sleep 递增延迟
- 把 sleep 当作控制节奏的“节拍器”,而非单纯停顿
- 避免写重复的
await sleep(...)+if判断,封装进统一逻辑
async function retryWithBackoff(fn, maxRetries = 3, baseDelay = 100) {
for (let i = 0; i try {
return await fn();
} catch (err) {
if (i === maxRetries) throw err;
await sleep(baseDelay * Math.pow(2, i)); // 指数退避
}
}
}
注意事项:别把它当线程阻塞用
sleep 只是让异步流程暂停,不是冻结 JS 引擎:
- 它不会阻塞 UI 渲染、定时器、网络回调等其他任务
- 不要在同步代码里试图“等 sleep”,那会失效(因为没 await)
- 频繁调用短间隔 sleep(如
sleep(1))可能触发事件循环饥饿,影响性能
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










