情報アイランド

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

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

非同期的な処理を複数回実行するにはasyncモジュールの下のような関数を使用します。

  • async.times関数
  • async.timesLimit関数
  • async.timesSeries関数

処理を完全に並列的に実行したい場合にはasync.times関数を使用し、並列的に実行する処理の最大数を指定して実行したい場合にはasync.timesLimit関数を使用し、直列的に実行したい場合にはasync.timesSeries関数を使用します。

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

async.times関数とasync.timesSeries関数

var async = require('async');

async.times(10, function (i, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, results) {
});
async.timesSeries(10, function (i, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, results) {
});

第1引数

第1引数に非同期的な処理を実行する回数を指定します。

第2引数

第2引数に非同期的な処理を関数として指定します。

この関数の第1引数は何回目の処理の実行であるかを表す整数であり、第2引数はコールバック関数です。

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

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

第3引数

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

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

async.timesLimit関数

async.timesLimit(10, 10, function (i, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, results) {
});

async.times関数やasync.timesSeries関数とほぼ同じですが、第1引数と第2引数の間に並列的に実行する処理の最大数を指定します。

サンプルコード1

async-times.js

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

async.timesSeries(10, function (i, callback) {
    setTimeout(function () {
        util.log(i);
        callback(null, i);
    }, Math.random() * 1000);
}, function (err, results) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(results);
        async.times(10, function (i, callback) {
            setTimeout(function () {
                util.log(i);
                callback(null, i);
            }, Math.random() * 1000);
        }, function (err, results) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
            else {
                console.log(results);
                async.timesLimit(10, 2, function (i, callback) {
                    setTimeout(function () {
                        util.log(i);
                        callback(null, i);
                    }, Math.random() * 1000);
                }, function (err, results) {
                    if (err) {
                        console.error(err);
                        process.exit(1);
                    }
                    else {
                        console.log(results);
                    }
                });
            }
        });
    }
});

使用パッケージ

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

実行結果

C:\work\node>node async-times.js
18 Jul 09:39:02 - 0
18 Jul 09:39:02 - 1
18 Jul 09:39:02 - 2
18 Jul 09:39:03 - 3
18 Jul 09:39:04 - 4
18 Jul 09:39:04 - 5
18 Jul 09:39:05 - 6
18 Jul 09:39:06 - 7
18 Jul 09:39:06 - 8
18 Jul 09:39:07 - 9
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
18 Jul 09:39:07 - 2
18 Jul 09:39:07 - 4
18 Jul 09:39:07 - 5
18 Jul 09:39:07 - 0
18 Jul 09:39:07 - 3
18 Jul 09:39:07 - 6
18 Jul 09:39:08 - 7
18 Jul 09:39:08 - 9
18 Jul 09:39:08 - 8
18 Jul 09:39:08 - 1
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
18 Jul 09:39:08 - 1
18 Jul 09:39:09 - 0
18 Jul 09:39:09 - 2
18 Jul 09:39:10 - 3
18 Jul 09:39:10 - 4
18 Jul 09:39:10 - 5
18 Jul 09:39:10 - 6
18 Jul 09:39:11 - 7
18 Jul 09:39:11 - 9
18 Jul 09:39:11 - 8
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

関連

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

-Node.js