await Promise.any 可获取最快成功响应的 CDN 资源,只认首个有效结果(状态 200–299 且解析正确),其余自动丢弃;全部失败时抛出含 errors 数组的 AggregateError,需配合超时控制与来源标记实现健壮降级。

直接用 await Promise.any 就能拿到最快响应且成功的 CDN 资源,关键不在“等”,而在“只认成功、不认快慢失败”。它天然适配多 CDN 场景——你发多个请求,谁先成功返回有效内容(状态码 200–299、解析无误),就立刻用谁,其余自动丢弃,不阻塞、不重试、不兜底。
准备可并行的 fetch 请求链
每个 CDN URL 都要封装成独立 Promise,并统一处理成功与失败路径:
- 成功时必须校验 HTTP 状态(
res.ok)和内容类型(如 JS 需text(),JSON 需json()),避免把 404 或 HTML 错误页当资源用; - 失败时主动
reject一个结构化对象(含url和error),方便后续聚合排查; - 不要在 map 内部
await或嵌套 try/catch,否则会串行化,失去并发意义。
用 Promise.any 拿首个有效结果
它不会因某个 CDN 返回 503 或超时而中断,只要有一个 resolve,就立即返回该值:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 返回值就是你指定的解析结果(比如
res.text()得到的字符串),不是 Response 对象本身; - 如果全部失败,会抛出
AggregateError,其errors属性是数组,每项对应一个 reject 原因,可直接用于日志或降级提示; - 注意:它不关心哪个 CDN 更“稳定”,只认第一个成功——所以实际中建议搭配合理超时(见下一条)。
加一层超时控制防卡死
Promise.any 本身不带超时,但你可以用 AbortController 或包装成带时限的 Promise:
- 对每个 fetch 加
signal,10 秒未响应就 abort,触发 reject; - 或者用
Promse.race([fetch(...), timeout(8000)])包一层,让单个请求最多等 8 秒; - 超时 reject 同样要进
Promise.any的候选池,确保它被当作一次“失败尝试”,不影响其他 CDN 继续竞争。
标记来源并做轻量降级
拿到内容后,最好知道它来自哪个节点,便于监控和问题定位:
- 可在每个 fetch 的 reject/resolve 中附带
url字段,成功时一并返回; - 若
Promise.any抛出AggregateError,说明所有 CDN 都不可用,此时可 fallback 到本地 bundle 或 Service Worker 缓存; - 避免在 catch 块里再发起新请求——那已脱离
any语义,应由上层策略统一管理。

















