Skip to content

关于 AsyncSignal

AsyncSignal 是一个轻量的异步控制库,提供两大核心模块——asyncSignalAsyncLoader,分别解决「异步协调」与「数据加载」两类常见问题。两者都基于可复用的异步信号构建,可与 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)。两者关系:

asyncSignalAsyncLoader
定位通用异步协调原语数据加载器(加载 / 缓存 / 重试 / 多源)
复用reset() 后可再次等待get() / refresh() 自动管理
典型场景事件等待、超时控制、手动完成接口请求、数据缓存、容灾合并

包入口

  • 主入口 asyncsignal:仅含 asyncSignal 信号部分(更轻量)
  • 子路径 asyncsignal/loader:含全部(asyncSignal + AsyncLoader

何时用哪个

  • 只需等待一个异步事件 / 超时 / 手动完成 → 用 asyncSignal
  • 需要加载数据 + 缓存 + 重试 + 中止 + 多源 → 用 AsyncLoader
  • 两者可组合:AsyncLoader 内部已用 asyncSignal,你也可以单独用 asyncSignal 做更底层的协调

继续阅读 安装快速入门

基于 MIT 许可协议发布