2013/07/08

async.jsを使ったNodeの非同期処理

Nodeでの非同期処理に欠かせないasync.jsの使い方メモ。
NodeはJavascriptで動くので、処理の流れがコールバックの連続になってしまう場合があります。
そんな状況を解決する為のnpm(Node Package Manager)なのです。
async.jsでは次のようなメソッドが用意されています。

# 処理を順番に実行するメソッド
 * series
 * waterfall

# 並列的に処理を実行するメソッド
 * parallel


async.jsのインストール
まずはasync.jsをインストールしましょう。
npmのインストールには、グローバルで行ってどのプロジェクトからも使えるようにする方法と、ローカルにインストールしてプロジェクトごとに必要なものだけを使う方法があります。今回はグローバル領域を汚したくないのでローカルで行っていきます。

次のコマンドをターミナルに入力して実行します。
(グローバルでインストールしたい場合は、このコマンドに-gオプションをつけて実行してください。)


これでNodeでasync.jsを使えるようになりました。
各メソッドの使い方は次のようになります。

series

seriesメソッドは第一引数に関数を格納した配列、第二引数には第一引数の配列に格納した関数が全て実行された後に入る最終的なコールバック関数を入れます。
このメソッドを実行すると第一引数に格納した関数が順番に実行され、最後に第二引数に指定した関数が実行されます。console.logの結果は次のようになります。

function1
function2
final callback & result = arg1,arg2

第一引数の配列に格納された関数の引数のcallbackは次に実行する関数を指しています。
(function1のcallbackはfunction2を指しているってことです)


waterfall

waterfallメソッドではseriesと同じように第一引数に実行したい順番で関数を格納した配列、第二引数には第一引数の処理が全て終わった後に実行される最終的なコールバック関数を入れます。console.logの結果は次のようになります。

function1
function2
final callback & result = 2


seriesとwaterfallの違いは引数の処理の方法です。
seriesは配列に格納された関数ひとつひとつが最終的なコールバック関数に引数を渡すのに対して、waterfallでは配列に格納された関数がリレー形式で次に実行される関数に引数を渡し、最終的なコールバック関数には配列の最後の関数で指定した引数が渡されます。


parallel

parallelメソッドは名前の通りに並列的に処理を実行するメソッドです。第一引数に実行したい関数を格納した配列、第二引数に第一引数の処理が全て終わった後に実行される最終的なコールバック関数を入れます。parallelメソッドを実行すると第一引数に格納した関数が同時に実行され、全ての関数の処理が終了すると第二引数の最終コールバック関数が実行されます。
console.logの結果は次のようになります。

function1
function2
function3
function3_END
function1_END
function2_END
final callback & result = arg1,arg2,arg3



実装例
実際には次のようにNodeの処理の中に組み込みます。