情報アイランド

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

Node.jsで複数の非同期的な処理を合成する

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

  • async.compose関数
  • async.seq関数

最後の引数の処理から最初の引数の処理に向かって処理を実行するような合成を行うにはasync.compose関数を使用し、最初の引数の処理から最後の引数の処理に向かって処理を実行するような合成を行うにはasync.seq関数を使用します。

async.compose関数とasync.seq関数

var async = require('async');

var f = async.compose(function (x, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (x, callback) {
    callback(null, 'ccc');
    //or
    callback(new Error('ddd'), null);
});
var f = async.seq(function (x, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (x, callback) {
    callback(null, 'ccc');
    //or
    callback(new Error('ddd'), null);
});

第1引数以降

第1引数以降に複数の非同期的な処理を関数として指定します。

この関数の第1引数は処理に対する入力であり、第2引数はコールバック関数です。

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

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

返り値

返り値として合成された非同期的な処理が関数として得られます。

この関数の第1引数には処理に対する入力を指定し、第2引数にはコールバック関数を指定します。

このコールバック関数の第1引数はエラーオブジェクトであり、第2引数は処理の結果です。

そのため、返り値の関数は下のように呼び出すことができます。

f('xxx', function (err, result) {
});

サンプルコード1

async.compose関数の使用例です。

async-compose.js

var async = require('async');

var f = async.compose(function (x, callback) {
    process.nextTick(function () {
        console.log(x);
        callback(null, x + 5);
    });
}, function (x, callback) {
    process.nextTick(function () {
        console.log(x);
        callback(null, x * 10);
    });
});
f(3, 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-compose.js
3
30
35

サンプルコード2

async.seq関数の使用例です。

async-seq.js

var async = require('async');

var f = async.seq(function (x, callback) {
    process.nextTick(function () {
        console.log(x);
        callback(null, x + 5);
    });
}, function (x, callback) {
    process.nextTick(function () {
        console.log(x);
        callback(null, x * 10);
    });
});
f(3, 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-seq.js
3
8
80

関連

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

-Node.js