元数据存储
每个信号都有一个 meta 对象,用于存储自定义元数据,并会在 reset / destroy 后仍然保留。
存储自定义数据
typescript
const signal = asyncSignal();
// 存储自定义数据
signal.meta.userId = "12345";
signal.meta.requestId = "abc-123";
signal.meta.attempts = 1;
signal.meta.tags = ["重要", "紧急"];
// 追踪生命周期事件
signal.meta.createdAt = Date.now();
signal.meta.status = "等待中";
signal.resolve("成功");
await signal();
signal.meta.status = "已完成";
signal.meta.completedAt = signal.timestamp;
// 元数据在 reset 时保留
signal.reset();
console.log(signal.meta.userId); // "12345" - 仍然可用
console.log(signal.meta.attempts); // 1 - 被保留
// 更新以进行重试
signal.meta.attempts = 2;类型安全的元数据(使用泛型)
通过第二个泛型参数为元数据指定类型:
typescript
interface RequestMetadata {
requestId: string;
userId: string;
attemptNumber: number;
maxRetries: number;
}
// 创建具有类型化元数据的信号
const signal = asyncSignal<string, RequestMetadata>();
// TypeScript 现在知道 meta 的确切类型
signal.meta.requestId = "req-123"; // ✅ 类型安全
signal.meta.userId = "user-456"; // ✅ 类型安全
signal.meta.attemptNumber = 1; // ✅ 类型安全
signal.meta.maxRetries = 3; // ✅ 类型安全
// signal.meta.invalidField = "test"; // ❌ 类型错误
// 也适用于静态方法
const resolved = asyncSignal.resolve<string, RequestMetadata>("成功");
resolved.meta.requestId = "req-456"; // ✅ 类型安全
const rejected = asyncSignal.reject<string, RequestMetadata>("错误");
rejected.meta.attemptNumber = 2; // ✅ 类型安全TIP
meta 跨 reset 保留的特性非常适合在重试场景中累加计数(如 attempts)或追踪生命周期。