Skip to content

Latest commit

Β 

History

History
63 lines (42 loc) Β· 2.13 KB

File metadata and controls

63 lines (42 loc) Β· 2.13 KB

prefer-abort-signal-any

πŸ“ Prefer AbortSignal.any() over manually forwarding abort events between signals.

πŸ’ΌπŸš« This rule is enabled in the βœ… recommended config. This rule is disabled in the β˜‘οΈ unopinionated config.

πŸ’‘ This rule is manually fixable by editor suggestions.

AbortSignal.any() creates an AbortSignal that aborts when any of the input signals abort. It avoids creating an extra AbortController and manually forwarding abort events from each input signal.

This rule only reports simple patterns where the controller is otherwise only used through .signal. Cases that inspect the composed signal's abort reason or alias the signal are ignored, as AbortSignal.any() preserves the reason from the first input signal to abort while manual bridging often does not.

Examples

// ❌
const abortController = new AbortController();

for (const signal of signals) {
	signal.addEventListener('abort', () => abortController.abort());
}

await fetch(url, {signal: abortController.signal});
// βœ…
const abortSignal = AbortSignal.any(signals);

await fetch(url, {signal: abortSignal});
// ❌
const abortController = new AbortController();

firstSignal.addEventListener('abort', () => abortController.abort());
secondSignal.addEventListener('abort', () => abortController.abort());

await fetch(url, {signal: abortController.signal});
// βœ…
const abortSignal = AbortSignal.any([firstSignal, secondSignal]);

await fetch(url, {signal: abortSignal});

Controllers with other behavior are intentionally ignored.

// βœ…
const abortController = new AbortController();

signal.addEventListener('abort', () => abortController.abort());
button.addEventListener('click', () => abortController.abort());

await fetch(url, {signal: abortController.signal});