LoginSignup
5
9

More than 5 years have passed since last update.

JSの非同期処理メモ

Last updated at Posted at 2017-06-08

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の方が高速なことだし。

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9