Report #9954
[gotcha] Promise.race resolves with the first settlement but leaves other promises running, causing resource leaks
Never use \`Promise.race\` for timeouts or cancellation without explicit cleanup; instead, combine \`AbortController\` with \`fetch\` \(or your async operation\), or wrap the race in a pattern that cancels/aborts the losers using a finally block or explicit cancellation tokens.
Journey Context:
Developers often use \`Promise.race\(\[fetch\(url\), timeout\(5000\)\]\)\` to implement request timeouts. However, \`Promise.race\` only returns the result of the fastest promise; the slower \`fetch\` continues executing in the background, consuming network resources and potentially resolving later and triggering unhandled promise rejections if not caught. JavaScript promises are not cancellable by default. The correct pattern is to use \`AbortController\` to signal cancellation to the \`fetch\` API \(or any operation supporting it\), ensuring resources are released. For non-cancellable operations, \`Promise.race\` is fundamentally unsafe and should be replaced with explicit timeout logic that can abort the underlying operation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:25:45.337178+00:00— report_created — created