情報アイランド

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

Node.jsで複数の非同期的な処理に同じパラメータを与えて実行する

複数の非同期的な処理に同じパラメータを与えて実行するにはasyncモジュールの下のような関数を使用します。

  • async.applyEach関数
  • async.applyEachSeries関数

処理を完全に並列的に実行したい場合にはasync.applyEach関数を使用し、直列的に実行したい場合にはasync.applyEachSeries関数を使用します。

なお、処理の実行中にエラーが発生しても既に開始している他の処理の実行は続行しますので注意してください。しかし、まだ開始していない処理の実行は行われません。

async.applyEach関数とasync.applyEachSeries関数

var async = require('async');

async.applyEach([
    function (arg1, arg2, callback) {
        callback(null, 'xxx');
        //or
        callback(new Error('yyy'), null);
    }, 
    function (arg1, arg2, callback) {
        callback(null, 'aaa');
        //or
        callback(new Error('bbb'), null);
    }
], 'lll', 'mmm', function (err, results) {
});
async.applyEachSeries([
    function (arg1, arg2, callback) {
        callback(null, 'xxx');
        //or
        callback(new Error('yyy'), null);
    }, 
    function (arg1, arg2, callback) {
        callback(null, 'aaa');
        //or
        callback(new Error('bbb'), null);
    }
], 'lll', 'mmm', function (err, results) {
});

第1引数

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

この関数の第1引数以降は非同期的な処理のパラメータであり、最後の引数はコールバック関数です。

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

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

第2引数以降

第2引数以降に複数の非同期的な処理のパラメータを指定します。

最後の引数

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

この関数の第1引数はエラーオブジェクトであり、第2引数は全ての処理の結果を格納している配列です。この配列の要素の順序は第1引数の処理の配列の要素の順序に対応します。

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

サンプルコード1

async-apply-each.js

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

async.applyEach([
    function (arg1, arg2, callback) {
        setTimeout(function () {
            util.log('function - foo');
            util.log('arg1 - ' + arg1);
            util.log('arg2 - ' + arg2);
            callback(null, 'foo');
        }, 3000);
    }, 
    function (arg1, arg2, callback) {
        setTimeout(function () {
            util.log('function - bar');
            util.log('arg1 - ' + arg1);
            util.log('arg2 - ' + arg2);
            callback(null, 'bar');
        }, 1000);
    }
], 100, 200, function (err, results) {
    console.log(results);
    async.applyEachSeries([
        function (arg1, arg2, callback) {
            setTimeout(function () {
                util.log('function - foo');
                util.log('arg1 - ' + arg1);
                util.log('arg2 - ' + arg2);
                callback(null, 'foo');
            }, 3000);
        }, 
        function (arg1, arg2, callback) {
            setTimeout(function () {
                util.log('function - bar');
                util.log('arg1 - ' + arg1);
                util.log('arg2 - ' + arg2);
                callback(null, 'bar');
            }, 1000);
        }
    ], 100, 200, function (err, results) {
        console.log(results);
    });
});

使用パッケージ

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

実行結果

C:\work\node>node async-apply-each.js
21 Jul 08:55:34 - function - bar
21 Jul 08:55:34 - arg1 - 100
21 Jul 08:55:34 - arg2 - 200
21 Jul 08:55:36 - function - foo
21 Jul 08:55:36 - arg1 - 100
21 Jul 08:55:36 - arg2 - 200
[ 'foo', 'bar' ]
21 Jul 08:55:39 - function - foo
21 Jul 08:55:39 - arg1 - 100
21 Jul 08:55:39 - arg2 - 200
21 Jul 08:55:40 - function - bar
21 Jul 08:55:40 - arg1 - 100
21 Jul 08:55:40 - arg2 - 200
[ 'foo', 'bar' ]

関連

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

-Node.js