Skip to content

静态方法(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:单元测试中替代真实加载,断言下游对成功 / 失败结果的处理逻辑。

基于 MIT 许可协议发布