关于 AsyncSignal
AsyncSignal 是一个轻量的异步控制库,提供两大核心模块——asyncSignal 与 AsyncLoader,分别解决「异步协调」与「数据加载」两类常见问题。两者都基于可复用的异步信号构建,可与 AbortController / fetch 等原生能力无缝协作。
asyncSignal:可复用的异步信号
类似 Promise.withResolvers(),但可被反复 reset 复用,并支持手动 resolve / reject、状态查询(isPending / isFulfilled / isRejected)、超时等待、约束条件(until)、自动重置,以及与 AbortController 的双向联动。
适合「多次等待同一异步事件」「超时控制」「手动触发完成」等场景:
typescript
import { asyncSignal } from "asyncsignal";
const signal = asyncSignal<string>();
// 多处等待同一个信号
signal().then((v) => console.log("got", v));
// 某刻外部触发完成
signal.resolve("done");
// 复用:reset 后又能再次等待
signal.reset();详见 asyncSignal 各特性。
AsyncLoader:数据加载器
封装「加载 + 缓存 + 中止 + 超时 + 重试 + 实例复用 + 错误兜底 + 多加载器」等能力。底层加载函数通过 args.abortSignal 接收合并后的中止信号(含主动中止与超时),可直接传入 fetch:
typescript
import { AsyncLoader } from "asyncsignal/loader";
const loader = new AsyncLoader(
async (args) => (await fetch("/api/data", { signal: args.abortSignal })).json(),
{ cache: 60_000, timeout: 5_000, retry: 2 },
);
const data = await loader.get();支持多加载器编排:fallback 备用容灾(主源失败自动切换)与 combine 多源合并(并发加载并聚合)。详见 AsyncLoader 各特性。
模块关系
AsyncLoader 构建于 asyncSignal 之上——内部用一个 asyncSignal 承载加载结果,因此自然具备信号的状态语义(可 abort、可观察 pending / fulfilled / rejected)。两者关系:
asyncSignal | AsyncLoader | |
|---|---|---|
| 定位 | 通用异步协调原语 | 数据加载器(加载 / 缓存 / 重试 / 多源) |
| 复用 | reset() 后可再次等待 | get() / refresh() 自动管理 |
| 典型场景 | 事件等待、超时控制、手动完成 | 接口请求、数据缓存、容灾合并 |
包入口
- 主入口
asyncsignal:仅含asyncSignal信号部分(更轻量) - 子路径
asyncsignal/loader:含全部(asyncSignal+AsyncLoader)
何时用哪个
- 只需等待一个异步事件 / 超时 / 手动完成 → 用
asyncSignal - 需要加载数据 + 缓存 + 重试 + 中止 + 多源 → 用
AsyncLoader - 两者可组合:
AsyncLoader内部已用asyncSignal,你也可以单独用asyncSignal做更底层的协调