駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

asyncとawait

async

簡単に説明すると、非同期な処理をスッキリと書ける構文です。

async function () {
     〜〜〜
}

functionの前に「async」とつけるだけです。これで非同期処理を実行できる関数を定義したことになります。

・asyncな関数は必ずPromiseを返します。

・関数が値を返せば、Promiseはその値でresolveします。

・関数がエラーをthrowした場合はPromiseはそのエラーでrejectします。

そしてアロー関数においても上記と同じ宣言をしたい場合、エラー処理をしたい場合、thenを用いて記述したい場合は下記のように記述できます。

  // アロー関数で記述
const sing = async () => {
throw new Error('エラー');   //エラー処理の記述
return 'あああああああ';
}
sing()
.then*1
.then*2
.then*3
.then*4
.then*5
.then*6
.then*7

下記のようにさらにすっきり記述できます。

//async/awaitで記述してみる
async function rainbow() {
await delayedColorChange('red', 1000);
await delayedColorChange('orange', 1000);
await delayedColorChange('yellow', 1000);
await delayedColorChange('green', 1000);
await delayedColorChange('blue', 1000);
await delayedColorChange('indigo', 1000);
await delayedColorChange('violet', 1000);
}
rainbow();

最後に、

「asyncとawait」を用いてrejectされる場合を確認してみます。

サンプルとして、4秒を過ぎた場合はエラーになるプログラムを用意します。

const fakeRequest = (url) => {
        return new Promise*8 + 500;
                  setTimeout(() => {
                      if (delay > 4000) {
                           reject('コネクションタイムアウト')
                      } else {
                           resolve(`ダミーデータ(${url})`)
                      }
                 }, delay)
        })
}

async function makeRequest() {
      //rejectの場合はtry&catchを使う
try {
             //resolveの場合、変数に代入すればOK
              let data1 = await fakeRequest('/hoge1');
              console.log(`data1: ${data1}`);
} catch (error) {
              console.log('エラー発生');
              console.log(error);
               }
 }
makeRequest();

エラーになる場合、正常に動く場合の2種類を確かめることができました。

 

*1:data) => {

console.log('成功:', data);
})
.catch((err) => {
console.log('間違いです。');
console.log(err)
})

エラーが出力され、エラーの内容も確認できます。

 

await

・awaitはasync関数の中でしか使えません。

・awaitはPromiseがresolveまたはrejectするまでasync関数の実行を一時的に停止します。

  await Promise処理

この上記の理由から「asyncとawait」はペアで一緒に使われることが多いです。

早速、前回記述した、背景色を変化させていくコードをasyncとawaitを用いて書き直してみます。

const delayedColorChange = (color, delay) => {
          return new Promise((resolve, reject) => {
              setTimeout(() => {
                    document.body.style.backgroundColor = color;
                    resolve();
             }, delay);
      })
}
delayedColorChange('red', 1000)
.then(() => delayedColorChange('red', 1000

*2:) => delayedColorChange('orange', 1000

*3:) => delayedColorChange('yellow', 1000

*4:) => delayedColorChange('green', 1000

*5:) => delayedColorChange('blue', 1000

*6:) => delayedColorChange('indigo', 1000

*7:) => delayedColorChange('violet', 1000

*8:resolve, reject) => {

                  const delay = Math.floor(Math.random() * (4500