情報アイランド

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

Node.jsで配列を非同期的に平坦化する

配列を非同期的に平坦化するにはasyncモジュールの下のような関数を使用します。

  • async.concat関数
  • async.concatSeries関数

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

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

また、async.concat関数の場合、配列の要素の順序は保持されませんので注意してください。

async.concat関数とasync.concatSeries関数

var async = require('async');

async.concat(['xxx', 'yyy', 'zzz'], function (item, callback) {
    callback(null, ['aaa', 'bbb']);
    //or
    callback(new Error('ccc'), null);
}, function (err, array) {
});
async.concatSeries(['xxx', 'yyy', 'zzz'], function (item, callback) {
    callback(null, ['aaa', 'bbb']);
    //or
    callback(new Error('ccc'), null);
}, function (err, results) {
});

第1引数

第1引数に配列を指定します。あるいは、配列以外のイテラブルを指定することもできます。

第2引数

第2引数に配列の要素から別の新しい配列を作成する処理を関数として指定します。

この関数の第1引数は配列の要素の値であり、第2引数はコールバック関数です。

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

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

第3引数

第3引数に配列の平坦化が完了したか、平坦化処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数は平坦化後の配列です。

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

サンプルコード1

async-concat.js

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

var xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
async.concatSeries(xs, function (item, callback) {
    setTimeout(function () {
        util.log(item);
        callback(null, [item, item * item, item * item * item]);
    }, Math.random() * 1000);
}, function (err, results) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(results);
        async.concat(xs, function (item, callback) {
            setTimeout(function () {
                util.log(item);
                callback(null, [item, item * item, item * item * item]);
            }, 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-concat.js
9 Jun 11:42:22 - 0
9 Jun 11:42:23 - 1
9 Jun 11:42:23 - 2
9 Jun 11:42:23 - 3
9 Jun 11:42:24 - 4
9 Jun 11:42:24 - 5
9 Jun 11:42:24 - 6
9 Jun 11:42:25 - 7
9 Jun 11:42:26 - 8
9 Jun 11:42:26 - 9
[ 0,
  0,
  0,
  1,
  1,
  1,
  2,
  4,
  8,
  3,
  9,
  27,
  4,
  16,
  64,
  5,
  25,
  125,
  6,
  36,
  216,
  7,
  49,
  343,
  8,
  64,
  512,
  9,
  81,
  729 ]
9 Jun 11:42:26 - 4
9 Jun 11:42:26 - 1
9 Jun 11:42:26 - 8
9 Jun 11:42:26 - 5
9 Jun 11:42:26 - 7
9 Jun 11:42:26 - 0
9 Jun 11:42:27 - 3
9 Jun 11:42:27 - 6
9 Jun 11:42:27 - 9
9 Jun 11:42:27 - 2
[ 4,
  16,
  64,
  1,
  1,
  1,
  8,
  64,
  512,
  5,
  25,
  125,
  7,
  49,
  343,
  0,
  0,
  0,
  3,
  9,
  27,
  6,
  36,
  216,
  9,
  81,
  729,
  2,
  4,
  8 ]

関連

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

-Node.js