0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】async/awaitについて

Last updated at Posted at 2024-11-19

今回は「asyncとawait」についての備忘録です。

1:「asyncとawait」とは?

・【Promiseを更に「直感的に、簡単に」】記述できるようにしたものです。

1-1:「async」について。

⬇︎
・「async」とは、【Promiseを返却する関数】です。

・「関数の先頭にAsync」と付いていた場合には【必ずPromiseが返ってくる】ことが担保されています。

・「Asyncを付けた関数(下記の例ならinit関数)」というのはこのinit関数自体も【Promiseのインスタンスを返します。】 下記の例ではconsole.log(init());とすると、Promiseが入っていることが分かります。

⬇︎

async

//⬇︎asyncで【Promiseを返却する関数】を定義する。
async function init() {
    //ここに処理
}

console.log(init()); //コンソール結果➡︎ これだけでも Promise {<fulfilled>: undefined が格納されている。
//⬆︎つまりこのinit関数自体も【Promiseのインスタンスを返します。】


1-2:「await」について。

・「await」はPromiseを返却する関数の【非同期処理が完了するのを待って、次の処理に移行するように制御をかける。】

・【awaitで受け取る】ということ。

⬇︎

await

//⬇︎asyncで【Promiseを返却する関数】を定義する。
async function init() {
   await sleep(0); //awaitで受け取る。
}



2: await が使われてるなら、「asyncを必ず付けよう。」

・例として定義した関数init()の中で、
awaitが使用されている場合には、定義した関数init()は必ず非同期処理されることになる。
⬇︎
・なので呼び出し元の関数init()自体にも、
この関数は、非同期処理されるということを伝えてあげる必要があります。
⬇︎
⭕️【awaitが関数コンテキスト内で使われているなら、asyncを必ず付けよう。】

awaitを使ってるなら,asyncは必ず定義
async function init() {
  await sleep(0); //awaitが付いているなら関数initには、asyncを付ける。
}

3: 実際にコードで触れてみる。

実践1: async/awaitを使って【Promiseのチェーンを行ってみます。】
コンソールに0, 1, 2, 3, 4...の結果を表示させる。

main.js
//⬇︎sleep関数(Promiseで非同期処理を定義。)
function sleep(val) {
  return new Promise(function (resolve) {
    //⬇︎1秒後にsetTimeoutでconsoleに数字を表示する非同期処理。
    setTimeout(function () {
      console.log(val++); //コンソール結果: 0,1,2,3...
      resolve(val); // resolveで次の処理に移行するように制御を加えることができます。
      // 次のawaitに「引数val」が渡っていく。 
    }, 1000);
  });
}

//⬇︎asyncで【Promiseを返却する関数】を定義する。
async function init() {
  let val = await sleep(0); //⬅︎await sleep(0);が「実行された結果を、変数valに代入。」
  console.log(val); //⬅︎コンソール結果: 1
  val = await sleep(val); //⬅︎次々とチェーン処理されていく。
  val = await sleep(val);
  val = await sleep(val);
  val = await sleep(val);
}

//⬇︎init関数を実行する。
init();

⬇︎
すると「async/awaitを使ってpromiseチェーン」が作成できます。
これがasyncとawait。
⬇︎
個人的に「Promise」と「asyncとawait」はゴチャゴチャになってしまうことがあるので、こうして忘れたとき用に見返すと良い。(人の脳なのでしょうがないですね…)


実践2: asyncで定義した関数自体にも、Promiseのインスタンスが返却されます。ということはthenで繋げた処理もできる。やってみる。

main.js
//⬇︎sleep関数(Promiseで非同期処理を定義。)
function sleep(val) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log(val++); //コンソール結果: 0
      resolve(val);
    }, 1000);
  });
}

//⬇︎asyncで【Promiseを返却する関数】を定義する。
async function init() {
  let val = await sleep(0);
  val = await sleep(val);
  val = await sleep(val);
  val = await sleep(val);
  val = await sleep(val);
  return val; //⬅︎「return val」を設定するとthen(function(val)に「valが渡っていく。」
}

//⬇︎init関数を実行する。
init().then(function (val) {
  console.log('hello ' + val); //⬅︎コンソール結果は、init()の結果0,1,2,3,4が表示されてから【その後に文字列"hello 5"が表示される。】
});

⬇︎
・「.then」を繋げてPromiseの非同期処理ができました。
・もちろん「.catch」のエラー処理も可能です。

4: 今回の備忘録でした。

メモ:積極的に使ってawaitとasyncに慣れる!
以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?