async/await (JavaScript) の概要
要は
- Promiseありき。Promise無き所にasync/await無し
await promise
と書くと、promise
が解決されるまでそこで待機await
を使えるのはasync
を付けて定義した関数のみ
少し説明
Promise
で非同期処理を逐次つなげると、コールバック地獄にはならないがごちゃごちゃする
// fn1(), fn2(), fn3() の返り値はPromise function sequential(param1) { fn1(param1).then(ret1 => { const param2 = getParam2(ret1); return fn2(param2); }).then(ret2 => { const param3 = getParam3(ret2); return fn3(param3); }); }
async/awaitを使うと、同期処理であるかのように書ける
async function sequentialAsync(param1) { const ret1 = await fn1(param1); // resolveされるまで待つ const param2 = getParam2(ret1); const ret2 = await fn2(param2); const param3 = getParam3(ret2); const ret3 = await fn3(param3); return ret3; }
ざっくり言えば、.then()
の代わりにawait
を使う。
ちなみにasync
を関数の返り値は自動的にPromise
でラップされる。
.catch()
はどう書き換えればよいのか
try-catchを使えばよい
function withCatch() { fn1().then(ret => { return fn2(ret); }.catch(err => { console.log(err); return fn2e(); }); } async function withCatchAsync() { try { const ret = await fn1(); return await fn2(ret); } catch (err) { console.log(err); return await fn2e(); }); }