これはブラウザ環境全般の仕様 に関わる話みたいです。整理してみます。
通常の HTML + JavaScript でも、fetch
や XMLHttpRequest
で非同期リクエストを送った後に
ページ遷移(window.location.href = ...
など)すると、そのリクエストはブラウザによって中断される ことがあります。
これは「ページを破棄したら、そのページから発生したネットワークリソースも不要」とブラウザが判断するためです。
👉 なので「API完了を待たずに画面遷移すると処理が消える」というのは、ブラウザ仕様として普通に起こり得ます。
Chrome, Firefox, Safari, Edge など主要ブラウザは共通して
「ページをアンロードするときに発生しているリクエストはキャンセルされる」傾向があります。
ただし挙動の細かさ(例えばリクエストが直前に送信済みでサーバーに届いたかどうか)はブラウザやタイミング次第。
画面遷移を遅らせる
await fetch(...)
を完了してから window.location.href = ...
する
ただしユーザー体験的に遅延が発生する
Beacon API を使う
navigator.sendBeacon(url, data)
はページが閉じても「必ずサーバーにデータを送る」ことを保証してくれる
主にログ送信やトラッキングに使われる
Service Worker 経由で送信
ページが破棄されても Service Worker がバックグラウンドでリクエストを処理してくれる
ただし仕組みが複雑
通常HTMLのページ遷移
→ ページが完全にリロードされるので、未完了のリクエストはキャンセルされる可能性が高い
React SPA の画面切り替え(クライアントルーティング)
→ ページ全体はリロードされず、コンポーネントのマウント/アンマウントだけが行われる
→ そのため、リクエスト自体は続行する(ただし UI が消えると setState
はできない)
👉 つまり、「リクエスト自体が消える問題」はフルリロード型のページ遷移特有であり、
React SPA の画面切り替えなら「リクエストは残るけど UI 更新はできない」という形になるわけです。
ブラウザは「ページ破棄時にリクエストを中断する」仕様を持っています。
React SPA はページを破棄しないのでリクエストは生き続けるが、UI更新ができなくなるだけです。
重要処理を確実に送信したいなら sendBeacon
や Service Worker
の活用が有効です。