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