UNPKG

decorio

Version:

First-class ECMAScript decorators for caching, binding, and concurrency patterns

31 lines (30 loc) 1.35 kB
/** * 🎯 Decorator `@latest` ensures that an async method runs *immediately* on each invocation, * but automatically cancels any prior in-flight invocation (via `AbortSignal`) if it's still pending. * * Think of it as `@debounced(0)` - it collapses overlapping calls - but it * executes synchronously (no deferral). * * ⚠️ Ignores all arguments when deciding what to cancel: every new call, regardless of its parameters, * will abort whatever was running before. * * Usage: * ```typescript * class Example { * @latest async fetchData(id: string): Promise<Data> { * const { signal } = latest; * * return fetch(`/api/data/${id}`, { signal }).then((r) => r.json()); * } * } * * const e = new Example(); * e.fetchData('1'); // fires immediately * e.fetchData('2'); // aborts the '1' request and fires '2' immediately * ``` */ export declare function latest<A extends Array<unknown>, R extends Promise<unknown>>(value: unknown, context: ClassMethodDecoratorContext<object, (...args: A) => R>): (...args: A) => R; export declare function latest<A extends Array<unknown>, R extends Promise<unknown>>(value: unknown, context: ClassFieldDecoratorContext<object, (...args: A) => R>): (originalFn: (...args: A) => R) => (...args: A) => R; export declare namespace latest { var signal: AbortSignal | undefined; }