ES7 async/awaitはES6 Promiseのシンタックスシュガーなのだし、JavaScriptでの非同期処理のデファクトスタンダードはPromiseと言っていいだろう。
Promiseについて
Promiseについては「JavaScript Promiseの本」を読むべし。
注意事項は「Promiseアンチパターン」にまとまっている。
非同期処理の例外対処
アンチパターンの1つは、非同期処理の例外はtry-catchで補足出来ないことに起因する。
参考:プログラマが想定していなかった例外でプロセスが落ちる問題にPromiseで対応する
Promise内でthrowされるErrorはpromise.catch()で処理できるため、Promise化した方がエラー処理をまとめやすくなるといえる。
ES7 async/await
結局のところES7 async/awaitは、Promise処理の記述を省略して書けるシンタックスシュガーなので、例外処理についてはPromiseと同様に扱う必要がある。
参考:Promiseとasync-awaitの例外処理を完全に理解しよう
これだとasync/awaitの利点は簡易的に書けることしかなくて、あまりメリットを感じない。
中身がPromiseなことに気を付けないといけないとか、関連するfunctionにasyncが付いて回ったりして、記述の見た目に反して逆にややこしさが増大していないだろうか。
ここは最初からPromiseで記述した方が、見た目と同じになり判りやすいように思える。
2017/06/12追記
async/awaitにはPromiseよりメリットがあるよ、という記事が出た。
参考:JavaScriptのasync/awaitがPromiseよりもっと良い
確かにメリットがあるので、「全員このasync/awaitを完全に理解して書く」がベストだ。
Node.js
Node.jsでは、非同期処理のコールバックfunctionはエラーと戻り値の2つの引数を取るのが一般的なので、この辺Promiseと一致しなくてまごつく。
Node.js v8.0.0ではutil.promisifyというユーティリティー関数が追加されている。
このpromisifyは、Node.jsで一般的なコールバックを取る非同期処理なfunctionをPromiseオブジェクトに換えてくれる。
積極的にPromiseを使う場合はこれでPromise化していきたい。
げんじつ
あれっ? Promiseって機能少なくない?
Promise.allとPromise.raceだけでがんばりたくないので、npm install bluebird
しよう。
参考:bluebird.js cheetsheet
「node.js v8/v7 のPromise とBluebird Promise を雑にベンチ比較した」によるとBluebird Promiseの方が高速なことだし。