技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

パフォーマンスを考慮した同期処理【Javascript】

async awaitを用いると、非同期であるJavascriptの処理を同期的に処理することができます。
しかし、何も考えずにawaitを連ねてしまうと、無駄な待ち時間が発生してしまうため注意が必要です。

商品Aと商品Bを購入する流れを例に考えてみましょう。

  • 商品Aをカゴに入れる
  • 商品Bをカゴに入れる
  • 支払いをする

これを単にawaitを連ねて記述すると次のようになります。

async function buyAB() {
  await 商品Aをカゴに入れる
  await 商品Bをカゴに入れる
  支払いをする
}

この関数の問題点は、従属関係にない、AとBをカゴに入れるという処理が同期的に処理されていることです。
同期的に処理されるべきところは、カゴに全ての商品を入れ終わる、支払いをする、この2つの処理です。

それを踏まえて修正すると次のようになります。

async function buyAB() {
  const buyA = 商品Aをカゴに入れる
  const buyB = 商品Bをカゴに入れる
  await Promise.all([buyA, buyB])
  支払いをする
}

Promise.all([])内に記述された処理が全て完了するのをawaitするだけです。
宣言された変数に代入する時点で処理は開始されているため、
待ち時間が少なくなります。