こんにちは、さち です。
今回は JavaScript で、複数の「画像」を読み込み終わるまで、次の処理に進まないようにする方法について書いていきます。
この方法は、以前作成した「X(旧Twitter)の高画質画像を表示するブックマークレット」でも使用しています。
使い方
サンプルコード
指定画像を読み込む「関数」を作り、その「関数」を使って複数の画像を読み込むコードです。
// 【関数】 指定画像の <img> 要素を取得 async function getImage(name) { const img = new Image(); img.src = `https://example.com/${name}`; await img.decode();// 画像の読み込みが終わるまで次に進まない return img; } // 2つの関数の処理が終わるまで then に進まない Promise.allSettled([ getImage('sample1.jpg'), getImage('sample2.jpg') ]) // 戻り値(PromiseValue)を受け取って処理する .then( ([img1, img2])=> { console.log(img1.width, img2.width);// 画像の幅を表示 });
コードのポイント
「まだだよ」をする await
と「もう良いよ」を返せる async
await
は Promise
が返ってくるまで次の処理に進まないようにする「演算子」です。
async
は「非同期関数」の定義に使います。「非同期関数」の中で return
を使うと resolved(解決)
の Promise
を返し、戻り値は PromiseValue
として送られます。
await
を使用できるのは、 async
で定義された「非同期関数」の中だけです。
img.decode()
で画像を読み込めたか判別
img.decode()
は画像の読み込みが終わると resolved(解決)
の Promise
を返します。
await
と組み合わせて使うことで、画像の読み込みが完了するまで次の処理に進まなくなります。
Promise.allSettled()
で処理がすべて完了したか判別
Promise.allSettled()
は記述した複数の処理がすべて完了すると、次の .then()
の処理に進みます。
Promise.allSettled()
内の処理はすべて並列で行われます。例えば、Promise.allSettled([ func1(), func2() ])
と記述した場合、func1()
と func2()
は処理が同時に始まるため、await
を使って順番に処理するよりも高速になります。
Promise.all()
でも同じことはできますが、どれか1つでも rejected(拒否)
の Promise
が返ってくると即座に中断されるため、エラー箇所を正確に把握できない場合があります。
コメント