swchrm logs

妄想技術録

なぜDBアクセスにAsync / Awaitを使う必要があるのか

背景

Firestoreへのアクセスでasyncが使われているのを見たが、そういえばなぜ必要だったか不明確だったので整理したかった。また今回のお話はJavaScriptベースのお話。

正解/不正解に関わらず現在の理解での仮説を書いてみる

非同期通信を実現する技術の一つであるAsync / Awaitを利用することで、ユーザーが同期処理のために操作を中断して通信を行わずに済み、ユーザー体験を向上させることができるため。また非同期通信を実現する別の技術であるPromiseやjQueryのDefferdなどもあるが、そちらに比べて新しい技術であるAsync / Awaitは簡潔に記述が容易なため。

Async / Awaitはどういった技術か

非同期通信を実現する技術の一つ。非同期通信とは、サーバーからの応答(レスポンス)を待っている間にもクライアントの操作を可能にする通信技術のこと。いいかえると、同期通信では「処理待ち」が発生する。非同期通信では「処理待ち」を裏で行っている。具体例ではGoogle Mapがある。 使えるのはES2016(ES7)から。

記述について理解する

MDN公式より引用。

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}

asyncCall();

awaitを付与されたメソッドが、「この処理を待ちます」という意味をもち、await以下の処理が実行されない。awaitを使えるのはasyncを付与した関数内。

Async / Awaitを使わない場合どうなるのか

非同期通信が実現できない、というとPromiseなどがあるので語弊があるが、例えばPromiseを使う場合は記述がややこしくなり、言い換えるとAsync / Awaitを利用することでPromiseを簡潔に書ける。

Async / Awaitを含む非同期通信を使わなかった場合の通信実現方法

同期通信を行う。

常に必要なのか

常に必要な通信方式ではない。 非同期通信を行いたいときに必要になる。つまり、なんらかの通信を行っている間にクライアントで操作もしたいときに必要になる。

結論

非同期通信を実現したいときはAsync / Awaitを使う。

考察

Promiseを理解するとより理解が深まる。

また、Promiseより簡潔に書けるため、基本的にはAsync / Awaitで書けばいいのではないか。

感想

なんとなーくわかった。

今後の課題

PromiseやDefferdとの使い分けを具体的に理解できればいいが、これはまたいつか時間ができたら。

参考にした情報

qiita.com

http://www.wakayama-u.ac.jp/~manda/webprg/webprg9.pdf

developer.mozilla.org

ossforum.jp