delay vs Node.js原生setTimeout异步等待到底该选哪个一文说清差异【免费下载链接】delayDelay a promise a specified amount of time项目地址: https://gitcode.com/gh_mirrors/de/delaydelay是一个用 Promise 实现精确异步等待的 Node.js 工具库只需await delay(100)就能让代码暂停指定毫秒后再继续执行。和 Node.js 原生setTimeout相比它解决了回调嵌套、无法取消、超时上限24.8 天等痛点并额外提供随机延迟、AbortSignal 中断等实用能力。本文带你一文说清两者的差异帮你做出选择。为什么等待是异步编程的高频需求在写爬虫限流、轮询接口、测试节流、动画分步执行等场景时你总需要等一等再继续。新手最容易写出这样的代码function foo() { bar(); setTimeout(baz, 100); // 100 毫秒后执行 }问题在于setTimeout是回调模型baz()游离在函数之外无法被await也难以判断什么时候执行完。而delay包返回的是一个Promise配合async/await就是线性的、可读的顺序代码import delay from delay; bar(); await delay(100); // 等待 100 毫秒 baz(); // 100 毫秒后顺序执行这一行await delay(100)就是它对原生方案最直观的升级。核心差异一张表看懂对比维度原生setTimeoutdelay库返回值定时器 ID回调风格Promise可await时长上限约 24.8 天49.7 天溢出无上限能否提前结束只能放弃回调clearTimeoutclearDelay()可提前落定能否中断等待不支持支持AbortSignal抛AbortError随机区间等待需自己实现内置rangeDelay(min, max)运行环境仅 Node.js / 浏览器通用浏览器同样可用能否携带返回值无delay(100, {value: Done}) 一个细节原生setTimeout的毫秒数受 32 位整数限制超过约 24.8 天就会溢出失效delay内部通过 unlimited-timeout 的替换实现绕开了这个限制见index.js第 1 行与package.json的 dependencies。三个原生 setTimeout 给不了的杀手锏1️⃣ 随机区间等待rangeDelay测试和爬虫的性能波动不可预测。与其写死等 1000ms不如给一个区间让等待落在随机值上import {rangeDelay} from delay; await rangeDelay(100, 200); // 随机等待 100~200 毫秒官方文档在 readme.md 中建议CI 上的断言阈值可以用区间代替固定值避免偶发超时。2️⃣ 可中断、可提前结束的等待原生方案里取消等待只能靠clearTimeout而回调就此消失调用方根本不知道等结束了。delay提供两种更优雅的控制AbortSignal 中断—— 信号一触发Promise 立即以AbortError拒绝import delay from delay; const abortController new AbortController(); setTimeout(() abortController.abort(), 500); try { await delay(1000, {signal: abortController.signal}); } catch (error) { console.log(error.name); // AbortError }clearDelay 提前落定—— 清除计时并让 Promise 立即以携带值 resolve等待被缩短而不是被丢弃import delay, {clearDelay} from delay; const p delay(1000, {value: Done}); setTimeout(() clearDelay(p), 500); console.log(await p); // 500 毫秒后输出 Done相关行为在 test.js 中有完整测试覆盖第 26~35 行 clear、第 37~51 行 Abort 用例。3️⃣ 自带返回值const result await delay(100, {value: }); console.log(result); // 原生setTimeout的回调只能靠闭包传值而这里等待本身就携带了结果。测试环境中还有 createDelay如果你用sinon等工具全局打桩了定时器delay也能注入自己的计时函数继续正常工作import {createDelay} from delay; const customDelay createDelay({clearTimeout, setTimeout}); const result await customDelay(100, {value: });实现位于 index.js 的createDelay第 6~51 行类型声明见 index.d.ts。结论异步等待到底选哪个只跑在 Node.js、需求最简单→ 官方 README 给出的建议是直接用内置 APIimport {setTimeout} from node:timers/promises; await setTimeout(1000);零依赖。需要浏览器支持、或用到以下任一能力→ 选delay超过 24.8 天的超长等待可中断AbortSignal或可提前落定clearDelay随机区间等待rangeDelay等待携带返回值一句话总结setTimeout想简单用原生timers/promises想要可控、可携带、可跨环境的等待就交给delay。安装方式npm install delay延伸阅读项目文件索引功能总览与示例readme.md核心实现index.js类型定义index.d.ts单元测试test.js依赖声明unlimited-timeout、random-intpackage.json【免费下载链接】delayDelay a promise a specified amount of time项目地址: https://gitcode.com/gh_mirrors/de/delay创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考