非同期処理 (async / await)
参考:
書き方
全体をラップする関数の定義に async
キーワードを使用する。async
関数の内部で、非同期に実行する関数呼び出しに await
キーワードを使用する。
async () => { const result = await doSomething() }
非同期に実行する処理は Promise
オブジェクトを返す。Promise
生成時に渡すコールバックでは、処理の成功時には resolve
を呼び出し、処理の失敗時には reject
を呼び出す。resolve
には返したい結果を引数として渡すことができる。reject
に Error
オブジェクトを生成して渡すと例外が投げられる。Promise
が resolve
されると 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
node.js + express.js サーバーの mongoose で、async / await を使えるようにする!簡単確実! | KOKENSHA の技術ブログ
async / await を使った非同期処理の書き方 | 30歳からのプログラミング
僕が async / await を好きなワケ | DevelopersIO
node.js がやたら非同期化しようとするのを async / await でどうにか同期化する | ほんじゃらねっと
非同期処理を含むループをシリアルに処理したい場合に AsyncAwait でスッキリ書くスニペット – Qiita
あなたの知らない async / await。並列を例に。- Qiita
async 関数
参考:
await 演算子
参考:
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
並列実行/直列実行
並列実行:map
と Promise.all
を使う
直列実行:reduce
と Promise.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)
setTimeout
を Promise
でラップして返す 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
モナド
参考: