情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで複数の一連の非同期的な処理を実行する

複数の一連の非同期的な処理を実行するにはasyncモジュールのasync.waterfall関数を使用します。

async.waterfall関数

var async = require('async');

async.waterfall([
    function (callback) {
        callback(null, 'aaa', 'bbb');
        //or
        callback(new Error('ccc'), null, null);
    }, 
    function (arg1, arg2, callback) {
        callback(null, 'ddd');
        //or
        callback(new Error('eee'), null);
    }
], function (err, results) {
});

第1引数

第1引数に複数の非同期的な処理を関数の配列として指定します。

この関数の最後の引数はコールバック関数であり、それ以外の引数は直前の処理の結果です。

処理が完了した場合や処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。

このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定し、第2引数以降には処理の結果(エラーが発生した場合にはnull)を指定します。

なお、処理は配列の最初の要素から順番に実行されます。

また、処理の結果の順序は保持されます。

第2引数

第2引数に全ての非同期的な処理が完了したか、処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数は最後の処理の全ての結果を格納している配列です。処理の結果の順序は保持されます。

この引数は指定しなくても構いません。

サンプルコード1

async.waterfall関数の使用例です。

async-waterfall.js

var async = require('async');
var util = require('util');

async.waterfall([
    function (callback) {
        util.log('task 1 start.');
        setTimeout(function () {
            var r1 = Math.random();
            util.log('task 1 complete.');
            util.log('result = ' + r1);
            callback(null, r1);
        }, 5000);
    }, 
    function (r1, callback) {
        util.log('task 2 start.');
        setTimeout(function () {
            var r2 = Math.random();
            util.log('task 2 complete.');
            util.log('result = ' + r2);
            callback(null, r1, r2);
        }, 10000);
    }, 
    function (r1, r2, callback) {
        util.log('task 3 start.');
        setTimeout(function () {
            var r3 = Math.random();
            util.log('task 3 complete.');
            util.log('result = ' + r3);
            callback(null, r1, r2, r3);
        }, 5000);
    }
], function (err, r1, r2, r3) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(r1);
        console.log(r2);
        console.log(r3);
    }
});

使用パッケージ

  • Async.js
    npm install asyncでインストールします。

実行結果

C:\work\node>node async-waterfall.js
9 Jul 10:49:47 - task 1 start.
9 Jul 10:49:52 - task 1 complete.
9 Jul 10:49:52 - result = 0.35875390722167033
9 Jul 10:49:52 - task 2 start.
9 Jul 10:50:02 - task 2 complete.
9 Jul 10:50:02 - result = 0.6784112282965482
9 Jul 10:50:02 - task 3 start.
9 Jul 10:50:07 - task 3 complete.
9 Jul 10:50:07 - result = 0.16776223285427005
0.35875390722167033
0.6784112282965482
0.16776223285427005

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js