Step 2: Browser & SPA
画面がフリーズする…?
非同期処理で解決した話
iPhoneのHEIC画像変換中、ブラウザが全く動かなくなって焦った私を救ってくれた「非同期」という概念の備忘録です。
JavaScriptは一度に一つのことしかできない
サーバー側の並列処理に慣れていた私には衝撃でしたが、ブラウザのJavaScriptは基本的に「一度に一つの作業」しかできません。重い画像変換をそのまま実行してしまうと、その間ブラウザは他の操作(ボタンを押すなど)をすべて無視してしまいます。これが「フリーズ」の正体でした。
await で「待ち」を入れる
これを解決するのが 非同期処理(Async/Await) です。重い処理の前に await をつけると、その処理が終わるまで「ブラウザ全体の動きを止めずに、その関数の実行だけを待機」させることができます。
// "async" をつけて非同期関数にする
async function handleImage(file) {
showLoading(); // ローディングを出す
// "await" で重い変換処理が終わるのを待つ
// この間、他のUIはフリーズしません
const converted = await heic2any({ blob: file });
hideLoading(); // 終わったら消す
}
UXを損なわずに重い処理をこなすには、この非同期のコントロールが不可欠でした。インフラで言うところの「非同期キュー」に近い感覚で理解できた時、スッと腑に落ちました。