最简洁的sleep函数是用promise和settimeout封装:const sleep = (ms) => new promise(resolve => settimeout(resolve, ms));它语义清晰、支持await、无需依赖库。

直接用 Promise 和 setTimeout 封装一个 sleep 函数,是最简洁、最符合直觉的方式——它不依赖外部库,语义清晰,且天然支持 await。
基础版:标准 Promise 封装
核心就是返回一个在指定毫秒后 resolve 的 Promise。这是最常用、最推荐的写法:
- 用箭头函数保持简洁,参数命名明确(如
ms表示毫秒) - 避免使用
new Promise((resolve) => setTimeout(resolve, ms))中多余的括号嵌套 - 可选地加一层类型提示(TypeScript)或参数校验(如非负整数)
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
增强版:支持取消与中断
原生 sleep 无法中途停止,但在复杂流程(如轮询、用户交互响应)中可能需要取消能力:
- 返回一个带
cancel方法的对象,内部用布尔标记是否已取消 - 在
setTimeout回调里检查标记,避免误触发 resolve - 取消后可选择 reject 或静默处理,按需设计
const sleep = (ms) => {
let canceled = false;
const promise = new Promise((resolve) => {
setTimeout(() => !canceled && resolve(), ms);
});
return {
promise,
cancel: () => { canceled = true; }
};
};
实用版:支持秒级输入与默认值
实际开发中常要传秒(如 sleep(2.5) 表示 2.5 秒),而非只接受毫秒:
- 自动识别输入单位:数字
默认视为秒,否则视为毫秒(经验性约定) - 或显式支持
{ ms: 1000 }/{ s: 2 }配置对象,更明确 - 提供默认值(如
sleep() === sleep(1000))提升易用性
const sleep = (t = 1000) => {
const ms = t setTimeout(resolve, ms));
};
工程版:类型安全 + 错误防护
在 TypeScript 项目或严格环境里,加一点防御性逻辑能让封装更健壮:
- 检查参数是否为有效数字(排除
NaN、Infinity、负数) - 类型定义明确返回
Promise<void></void>,避免误用返回值 - 对非数字输入抛出友好错误,而不是静默失败
const sleep = (ms: number): Promise<void> => {
if (!Number.isFinite(ms) || ms setTimeout(resolve, ms));
};</void>











