情報アイランド

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

Node.jsで同期的な処理を非同期的な処理に変換する

同期的な処理を非同期的な処理に変換するにはasyncモジュールのasync.asyncify関数やasync.ensureAsync関数を使用します。

普通の関数

同期的な処理が普通の関数として表されている場合にはまずasync.asyncify関数を使用して同期コールバック関数を引数として受け取る関数に変換します。

var f = async.asyncify(function (arg1, arg2) {
    return 'xxx';
});

第1引数に普通の関数を指定します。

返り値として同期コールバック関数を引数として受け取る関数が得られます。

この関数は第1引数の関数が同期コールバック関数を引数として受け取る関数に変換されたものです。

同期コールバック関数を引数として受け取る関数

同期的な処理が同期コールバック関数を引数として受け取る関数として表されている場合にはasync.ensureAsync関数を使用します。

var f = async.ensureAsync(function (arg1, arg2, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
});

第1引数に同期コールバック関数を引数として受け取る関数を指定します。

返り値として非同期コールバック関数を引数として受け取る関数が得られます。

この関数は第1引数の関数が非同期コールバック関数を引数として受け取る関数に変換されたものです。

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

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

これにより非同期的な処理の実行が開始されます。

サンプルコード1

async-asyncify.js

var async = require('async');

var af = async.ensureAsync(async.asyncify(function (arg) {
    return arg;
}));

af('foo', function (err, result) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(result);
    }
});

console.log('start.');

使用パッケージ

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

実行結果

C:\work\node>node async-asyncify.js
start.
foo

関連

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

-Node.js