非同期処理 (async / await)

参考:

async function | MDN

await | MDN

書き方

全体をラップする関数の定義に async キーワードを使用する。async 関数の内部で、非同期に実行する関数呼び出しに await キーワードを使用する。

async () => {
  const result = await doSomething()
}

非同期に実行する処理は Promise オブジェクトを返す。Promise 生成時に渡すコールバックでは、処理の成功時には resolve を呼び出し、処理の失敗時には reject を呼び出す。resolve には返したい結果を引数として渡すことができる。rejectError オブジェクトを生成して渡すと例外が投げられる。Promiseresolve されると await 呼び出しが終了して値を返す。

const doSomething = () => {
  return new Promise((resolve, reject) => {
    // Do something
    if (success) {
      resolve(result)
    } else {
      reject(new Error('Failure!'))
    }
  })
}

例外を処理するには try {...} catch() {...} 文を使用する。

async () => {
  try {
    const result = await doSomething()
  } catch (error) {
    console.log(error)
  }
}

参考:

今更ながら Babel で ES7 Async / Await を試してみた – Qiita

ES2017 の新機能「async / await」で Promise (非同期処理) をスッキリ書く | maesblog

JavaScript の async / await が Promise よりもっと良い – Qiita

async / await で非同期処理はシンプルになる – Qiita

Node.js の非同期処理のコールバック地獄を Promise、Generator、async / await を使って解決する – Qiita

Promise と async / await これからの非同期処理の書き方 | Deep Rain

async await の使い方 – Qiita

node.js + express.js サーバーの mongoose で、async / await を使えるようにする!簡単確実!| KOKENSHA の技術ブログ

async / await 入門 – Qiita

async / await を使った非同期処理の書き方 | 30歳からのプログラミング

僕が async / await を好きなワケ | DevelopersIO

node.js がやたら非同期化しようとするのを async / await でどうにか同期化する | ほんじゃらねっと

async / await とは | CodeGrid

非同期処理を含むループをシリアルに処理したい場合に AsyncAwait でスッキリ書くスニペット – Qiita

あなたの知らない async / await。並列を例に。- Qiita

Async Functions – Qiita

async 関数

参考:

async function | MDN

await 演算子

参考:

await | MDN

Promise を使う

参考:

Promise、async / await に立ち向かう – Qiita

Promise が分かれば簡単!async, await – Qiita

Promise と async / await で JavaScript の非同期処理をシンプルに記述する | Subterranean Flower Blog

非同期関数 – Promise をわかりやすくする | Google Developers

Understand promises before you start using async/await | Daniel Brain

Promises and Why Async / Await Wins the Battle | The Stream Blog

リトライ処理

参考:

Promise と async・await でリトライ処理を実装する | Corredor

map

参考:

JavaScript の配列の map で async / await を使う方法 – Qiita

Array 操作関数の callback に async / await な関数を指定したい – Qiita

並列実行/直列実行

並列実行:mapPromise.all を使う

直列実行:reducePromise.resolve を使う

参考:

async / await の並列実行 / 直列実行 / 即時実行の書き方 – Qiita

async/await を全力で使ってみて発見したイディオム – Qiita

for-of 文で直列に実行する

参考:

非同期処理の直列化:今や Array.reduce を使わなくてもできますよね | 銀の弾丸

while 文で使う

let counter = 0

const increment = () => { ++counter }

(async () => {
  do {
    await increment()
    console.log(counter)
  } while (counter < 10)
})()

参考:

Promise で再帰処理を使って while っぽいループ処理を行う – Qiita

スリープ/ウェイト/ディレイ (setTimeout)

setTimeoutPromise でラップして返す sleep 関数を定義する。

const sleep = (msec) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, msec)
  })
}

async キーワードを伴う関数内で await を使って sleep の完了を待つ。

(async () => {
  console.log(new Date())
  await sleep(1000)
  console.log(new Date())
})()

参考:

ES2017 async / await で sleep 処理を書く – Qiita

JavaScript で一定時間待ってから処理を開始する方法 | ラボラジアン

JavaScript (Node.js) で sleep() アラカルト – Qiita

Let’s make a JavaScript Wait function | Hacker Noon

Combination of async function + await + setTimeout – Stack Overflow

Babel

参考:

Babel 6.7 で async / await する – Qiita

Babel で async / await を試す | スマホ神

Enabling Async/Await and Generator Functions in Babel and Node JS | Binyamin

async/await with webpack + babel – GitHub Gist

preset-env

参考:

@babel/preset-env | Babel [Official]

plugin-transform-async-to-generator

参考:

@babel/plugin-transform-async-to-generator | Babel [Official]

Promise.all

参考:

Promise と async / await で複数の非同期処理の完了を待機する | abcdefg…..

async / await の実装

参考:

ES6 Generator を使って async / await を実装するメモ | maru source

チュートリアル

参考:

Async/await | The Modern Javascript Tutorial

モナド

参考:

async / await と promise 使えばモナド糖衣構文っぽいの書けそうだよねって思って書いてみたけど、async () => {} で wrap しないといけないしまぁそんなにきれいに書けなかったって話 | ゆるよろ日記

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です