テクノロジーTweetnode.jsの非同期処理を書く際に便利なPromiseについて紹介します。4.x系以降でデフォルト利用可能な機能になります。Promiseとは非同期処理を抽象化したオブジェクトで、非同期処理に関する統一的なインターフェースを提供します。これにより、非同期処理のコールバック関数の書き方が明確になり、可読性があがるというメリットがあります。0.12系以降から徐々にES6の機能が導入されていて。4系以降からはデフォルトで使えるようになっています。supportPromiseをどうやって使うかでは、Promiseをつかうってどうやって非同期処理を書くかざっくりとまとめてみると、以下の通りになります。Promiseクラスのオブジェクトを作成する。作成したpromiseオブジェクトに対して、成功時と失敗時に行う処理を関数として登録する。promise.then()というメソッドで登録することができます。何か処理が失敗したときにrejectを呼び出す。Promiseで渡した関数の第1引数にあるresolve関数、エラー時にはreject関数を呼び出すようにします。上記の非同期処理の成功・失敗時の処理は、Promise.thenメソッドで指定することができます。resolve関数呼出し時に引数に値を設定すると、.thenメソッドで指定したコールバック関数で値を受け取ることができます。処理が失敗した場合は、.thenで指定したコールバック関数は呼ばれずに、.catchで指定したコールバック関数が呼ばれるようになります。することで、非同期処理の成功時・失敗時の処理をかき分けることができ、可読性があがります。Promisesの仕様で以下のように定められています。エラーが発生してrejectした時がRejectedに変化します。GitHub下記の図にあるとおり、Promiseの状態は一度FulFilledまたはRejectedに遷移した後、状態が固定され、変化することはありません。onRejectedの関数のどちらかが一度限りだけ呼ばれることになります。objectを返すので、メソッドチェーンの形で複数の.thenを登録できます。objectが作成され(Pending)、処理に応じてFulFilled・Rejectedの処理を連続して行うことができます。厳密ではないですが、.thenのメソッドチェーンを行う際には以下の図ような感じでチェーンのたびに新たにobjectが作られて処理が進んでいきます。onRejected)resolveした時、onFulFilledが呼ばれ、反対にrejectしたときはonRejectedが呼ばれます。onRejectedは必須ではないのでどちらか一方のみ登録することが可能です。.catchメソッドも用意されていて、エラー時の処理のみ登録したい場合は.catchを使うと便利です。実際には.catchは以下の処理と同じです。エンジンであるv8では、以下の箇所で.catchの実装がされています。on_resolveをundefinedにしている。.catchメソッドは返り値として新たにpromiseオブジェクトを返すため、メソッドチェーンをつかって複数の処理を連続して行うことができます。.thenをメソッドチェーンで複数続けて書く場合、1番目のthenの中でエラーが発生してrejectが呼ばれた場合、2番目のthenは呼ばれずにcatchで指定されたコールバックが実行されます。下記に例をしめしているのでコードを読むとわかりやすいです。最後の.thenのコールバック関数でエラーが起きたときに、これより後ろに.catchがつながっていないためエラーを拾うことができないので注意が必要です。objectに対して処理を行うインターフェースも用意されています。promise.raceの2つがあり、ここで紹介していきます。objectがresolveされた時、初めて.thenが呼ばれます。配列中の各オブジェクトでresolveに渡された値が配列で渡ってくるので、それを利用することができます。});v8では以下の箇所で実装されています。deferred.promise;}Promise.racePromise.allと同様に、複数のpromiseオブジェクトを引数にとるのがPromise.raceです。.raceは、.allと違って、登録した複数のpromiseオブジェクトのうち、一番早く処理が終わったもののresolveの結果を.thenに渡します。});ポイントとしては、引数に渡したすべてのpromiseオブジェクトの処理は実行されるが、一番早くresolveが呼ばれたものに対して.thenへ値が渡されることです。上記のコードの実行結果として、各promiseオブジェクトのconsole.logが出力されているのが確認できると思います。promise.raceのv8での実装は以下の通りになります。この時点で実際にpromiseの処理を一つずつ行っている。deferred.promise;}まとめnode.js(v8)で実装されているPromiseオブジェクトの概要について解説しました。非同期処理は、async.jsなどをつかって実装することもできるのですが、Promiseを使うと、成功時・失敗時の処理を分離してかけるので、さらに可読性が上がって良いと思いました。このPromiseをベースにしてつくられたラッパーなので、async/awaitを学ぶ際にはPromiseの仕組みを知っていると理解が深まると思います。node.jsのasync/awaitに関しては別の記事で取り上げたいと思います。http/2の実装がマージされました。config.'月別アーカイブ参加グループプログラミングテクノロジーはてなブログをはじめよう!kaktsさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。