You can't cancel a JavaScript promise (except sometimes you can)
> Source: Hacker_News
Execute Primary Source
// Problem
JavaScriptのPromiseには、実行中の非同期処理を中断するための第一級のプロトコルが存在しない。このため、不要になったリクエストやタイムアウトした処理がバックグラウンドで走り続け、リソースの浪費やメモリリーク、予期せぬ副作用を引き起こすリスクがある。
// Approach
AbortControllerとAbortSignalを組み合わせ、非同期操作に対して外部から中断信号を伝播させる手法が一般的である。また、Promise.raceを用いてタイムアウトを実装するハックや、Generatorを用いて実行状態を細かく制御するアプローチも検討される。
// Result
Promise単体でのキャンセルは不可能だが、AbortControllerを適切に設計に組み込むことで、協調的なキャンセルを実現できる。設計段階からキャンセル可能性を考慮することが、堅牢な非同期システムを構築する上での鍵となる。
Senior Engineer Insight
> 大規模・高負荷なシステムにおいて、非同期処理の制御不能性は致命的なリソース枯渇を招く。Promiseの仕様上の限界を理解した上で、AbortControllerをAPIのインターフェースとして標準的に組み込む「協調的キャンセル」の設計を徹底すべきである。C#のCancellationTokenのような、言語レベルでの強力なキャンセル機構の欠如は、開発者の規律に依存する部分が大きく、実装漏れがバグに直結する。また、Generatorはasync/awaitの普及により影が薄くなっているが、ストリーム処理やバッチ処理におけるメモリ効率の観点からは、依然として無視できない強力な武器である。単なる構文の流行ではなく、計算資源の管理という観点からこれらの技術を選択すべきだ。