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 ]
関連
