事象
Reactで作ったWebページをスマホで確認していたところ、とあるページ遷移で、真っ白な画面が表示された。
「ホワイトアウト」と呼ばれる現象。
処理内容
「componentDidMount」のタイミングで、Fetch APIを使ってデータ取得。
タイムアウト時間を過ぎたら、fetch処理をキャンセルさせようとした。
コード
fetch.js
// after render
componentDidMount(){
const controller = new AbortController();
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
// 2秒後にfetchキャンセル
wait(2000).then(() => {
controller.abort();
});
fetch('https://hogehoge.com/send', {
mode: 'cors',
method: 'POST',
signal: controller.signal, // controllerが持つsignalをfetchに渡す
header: {
'Content-Type': 'application/json',
},
body: JSON.stringify(JSONdata),
}).then((data) => {
// 応答が得られた場合の処理
}).catch((error) => {
// fetchキャンセルの場合、ここに入る
// errorはundefined
});
}
どこに問題があったか
「AbortController」をサポートしていないバージョンの「Chrome for Android」による読み込み。
この時の「Chrome for Android」のバージョンは「55」。
Chromeでの「AbortController」サポートは「66」以降になる。
https://developer.mozilla.org/en-US/docs/Web/API/AbortController