情報アイランド

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

Node.jsで互いに依存関係のある複数の非同期的な処理を実行する

2016/10/12

互いに依存関係のある複数の非同期的な処理を実行するにはasyncモジュールのasync.auto関数を使用します。

async.auto関数

var async = require('async');

async.auto({
    xxx: function (callback) {
        callback(null, 'aaa');
        //or
        callback(new Error('ccc'), null);
    }, 
    yyy: [
        'xxx', 
        function (results, callback) {
            callback(null, 'ddd');
            //or
            callback(new Error('eee'), null);
        }
    ]
}, 10, function (err, results) {
});

第1引数

第1引数に複数の非同期的な処理をオブジェクトとして指定します。

このオブジェクトでは1つの非同期的な処理を1つのプロパティで表すようにします。

非同期的な処理の名称をプロパティ名とし、非同期的な処理が依存する非同期的な処理の名称と非同期的な処理から成る配列をプロパティの値とします。ただし、非同期的な処理は配列の最後の要素とします。

また、非同期的な処理は関数として指定します。

この関数の第1引数は非同期的な処理が依存する非同期的な処理の結果を格納しているオブジェクトであり、第2引数はコールバック関数です。

第1引数のオブジェクトは非同期的な処理の名称がプロパティ名となっており、非同期的な処理の結果がプロパティの値となっています。

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

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

第2引数

第2引数に並列的に実行する処理の最大数を指定します。この引数は指定しなくても構いません。デフォルトはInfinityです。

第3引数

第3引数に全ての非同期的な処理が完了したか、処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数は全ての処理の結果を格納しているオブジェクトです。

第2引数のオブジェクトは非同期的な処理の名称がプロパティ名となっており、非同期的な処理の結果がプロパティの値となっています。

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

サンプルコード1

async-auto.js

var async = require('async');

async.auto({
    f1: function (callback) {
        callback(null, 1);
    }, 
    f2: function (callback) {
        callback(null, 2);
    }, 
    f3: function (callback) {
        callback(null, 3);
    }, 
    f4: function (callback) {
        callback(null, 4);
    }, 
    f12: [
        'f1', 
        'f2', 
        function (results, callback) {
            callback(null, results.f1 + results.f2);
        }
    ], 
    f34: [
        'f3', 
        'f4', 
        function (results, callback) {
            callback(null, results.f3 + results.f4);
        }
    ], 
    f1234: [
        'f12', 
        'f34', 
        function (results, callback) {
            callback(null, results.f12 * results.f34);
        }
    ], 
}, 2, function (err, results) {
    console.log(results);
});

使用パッケージ

  • Async.js
    npm install asyncでインストールします。

実行結果

C:\work\node>node async-auto.js
{ f1: 1, f2: 2, f3: 3, f4: 4, f12: 3, f34: 7, f1234: 21 }

関連

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

-Node.js