静态方法(resolve / reject)
AsyncLoader.resolve() 与 AsyncLoader.reject() 直接创建预置终态的实例——类似 Promise.resolve / Promise.reject,内部 signal 已 settle,get() 不会触发任何加载。
创建预置实例
typescript
import { AsyncLoader } from "asyncsignal/loader";
// 创建一个已成功的实例
const ok = AsyncLoader.resolve("data");
console.log(ok.isFulfilled()); // true
console.log(ok.result); // 'data'
// 创建一个已失败的实例
const fail = AsyncLoader.reject(new Error("boom"));
console.log(fail.isRejected()); // true
console.log(fail.error?.message); // 'boom'get() 不触发加载
预置实例的 get() 直接返回预置结果(或抛出预置错误),不会调用底层加载函数,loading 始终为 false:
typescript
const fail = AsyncLoader.reject(new Error("offline"));
try {
await fail.get(); // 直接抛出 Error('offline'),不发起任何加载
} catch (e) {
console.log((e as Error).message); // 'offline'
}
console.log(fail.loading); // false
console.log(fail.isRejected()); // true与「加载失败」的区别
普通实例加载失败(rejected)后,再次 get() 会自动重试(重新 load())。而 AsyncLoader.reject() 创建的预置实例是「永远 rejected」——get() 只会反复抛出同一个错误,绝不重新加载。
实例特性
| 特性 | 预置实例 | 普通实例 |
|---|---|---|
| 初始状态 | isFulfilled() / isRejected() | isPending()(autostart=true 时立即加载) |
get() | 直接返回预置值 / 抛预置错误 | 触发 load()(首次 / 缓存失效 / 失败重试) |
loading | 始终 false | 加载期间为 true |
| 缓存 | 不写入,hash 为空 | 按 hash 缓存 |
| multiplex | 不参与(无 hash) | 可复用 |
解除预置态
refresh() 与 invalidate() 会解除预置态,恢复正常加载生命周期(底层 loader 重新被调用):
typescript
const fail = AsyncLoader.reject(new Error("boom"));
// 底层 loader 已能提供真实数据时,refresh 解除预置态并重新加载
await fail.refresh(); // 调用底层 loader 重新加载适用场景
- 默认值 / 占位实例:UI 渲染需要一个「立即可用的 loader」,后续再
refresh()拉取真实数据。 - 回退值:作为终态兜底(如
AsyncLoader.resolve(defaultData)在编排中提供保底数据)。 - 测试 mock:单元测试中替代真实加载,断言下游对成功 / 失败结果的处理逻辑。