Node.jsで配列の全ての要素が条件を満たすか非同期的にチェックする
目次
配列の全ての要素が条件を満たすか非同期的にチェックするには下のような関数を使用します。
async.every
関数async.everyLimit
関数async.everySeries
関数
チェック処理を完全に並列的に実行したい場合にはasync.every
関数を使用し、並列的に実行するチェック処理の最大数を指定して実行したい場合にはasync.everyLimit
関数を使用し、直列的に実行したい場合にはasync.everySeries
関数を使用します。
なお、条件を満たさない要素が見付かったり、チェック処理の実行中にエラーが発生したりしても既に開始している他の要素に対するチェック処理の実行は続行しますので注意してください。しかし、まだ開始していない要素に対するチェック処理の実行は行われません。
また、チェックは配列の最初の要素から順番に行われます。
async.every関数とasync.everySeries関数
var async = require('async');
async.every(['xxx', 'yyy', 'zzz'], function (item, callback) {
callback(null, true);
//or
callback(null, false);
//or
callback(new Error('aaa'), null);
}, function (err, result) {
});
async.everySeries(['xxx', 'yyy', 'zzz'], function (item, callback) {
callback(null, true);
//or
callback(null, false);
//or
callback(new Error('aaa'), null);
}, function (err, result) {
});
第1引数
第1引数に配列を指定します。あるいは、配列以外のイテラブルを指定することもできます。
イテラブルとは?
第2引数
第2引数にチェック処理を関数として指定します。
この関数の第1引数は配列の要素の値であり、第2引数はコールバック関数です。
チェック処理が完了した場合やチェック処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。
このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull
)を指定し、第2引数には配列の要素が条件を満たすかどうかを真偽値として指定します(エラーが発生した場合にはnull
を指定します)。
第3引数
第3引数に配列の全ての要素が条件を満たしたか、条件を満たさない配列の要素が見付かったか、チェック処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。
この関数の第1引数はエラーオブジェクトであり、第2引数は配列の全ての要素が条件を満たすかを表す真偽値です。
この引数は指定しなくても構いません。
async.everyLimit関数
async.everyLimit(['xxx', 'yyy', 'zzz'], 10, function (item, callback) {
callback(null, true);
//or
callback(null, false);
//or
callback(new Error('aaa'), null);
}, function (err, result) {
});
async.every
関数やasync.everySeries
関数とほぼ同じですが、第1引数と第2引数の間に並列的に実行するチェック処理の最大数を指定します。
サンプルコード1
async-every.js
var async = require('async');
var util = require('util');
var xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
async.everySeries(xs, function (item, callback) {
setTimeout(function () {
util.log(item);
callback(null, item < 100);
}, Math.random() * 1000);
}, function (err, result) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log(result);
async.every(xs, function (item, callback) {
setTimeout(function () {
util.log(item);
callback(null, item < 4);
}, Math.random() * 1000);
}, function (err, result) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log(result);
async.everyLimit(xs, 2, function (item, callback) {
setTimeout(function () {
util.log(item);
callback(new Error('error'), null);
}, Math.random() * 1000);
}, function (err, result) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log(result);
}
});
}
});
}
});
使用パッケージ
- Async.js
npm install async
でインストールします。
実行結果
C:\work\node>node async-every.js
8 Jun 09:38:33 - 0
8 Jun 09:38:34 - 1
8 Jun 09:38:34 - 2
8 Jun 09:38:35 - 3
8 Jun 09:38:35 - 4
8 Jun 09:38:36 - 5
8 Jun 09:38:37 - 6
8 Jun 09:38:37 - 7
8 Jun 09:38:38 - 8
8 Jun 09:38:39 - 9
true
8 Jun 09:38:39 - 9
false
8 Jun 09:38:39 - 6
8 Jun 09:38:39 - 2
8 Jun 09:38:39 - 1
Error: error
at Timeout._onTimeout (C:\work\node\async-every.js:32:16)
at tryOnTimeout (timers.js:224:11)
at Timer.listOnTimeout (timers.js:198:5)
関連
