1. ホーム
  2. node.js

[解決済み] 非同期nodejsモジュールエクスポート

2023-02-13 09:31:31

質問

以下の例の "async.function" は、FS または HTTP リクエストになります。

以下はサンプルコード(asynmodule.js)です。

var foo = "bar"
async.function(function(response) {
  foo = "foobar";
  // module.exports = foo;  // having the export here breaks the app: foo is always undefined.
});

// having the export here results in working code, but without the variable being set.
module.exports = foo;

非同期コールバックが実行されたときだけ、モジュールをエクスポートするにはどうしたらよいですか?

編集 私の実際の使用例について簡単にメモしておきます。私はnconfを設定するためのモジュールを書いています( https://github.com/flatiron/nconf ) を設定するモジュールを書いています (すなわち、設定ファイルをパースして nconf を設定します)。

どのように解決するのですか?

エクスポートは機能外なので動作しません。 foo 宣言が中にあるからです。しかし、もしエクスポートを内部に置くと、モジュールを使うときに、エクスポートが定義されているかどうか確認することができません。

ansyncシステムで動作する最良の方法は、コールバックを使用することです。コールバックの代入メソッドをエクスポートしてコールバックを取得し、非同期実行時にそれを呼び出す必要があります。

例を挙げます。

var foo, callback;
async.function(function(response) {
    foo = "foobar";

    if( typeof callback == 'function' ){
        callback(foo);
    }
});

module.exports = function(cb){
    if(typeof foo != 'undefined'){
        cb(foo); // If foo is already define, I don't wait.
    } else {
        callback = cb;
    }
}

ここで async.function は非同期呼び出しを象徴する単なるプレースホルダーです。

メインで

var fooMod = require('./foo.js');
fooMod(function(foo){
    //Here code using foo;
});

複数のコールバック方法

もしあなたのモジュールが複数回呼ばれる必要がある場合、コールバックの配列を管理する必要があります。

var foo, callbackList = [];
async.function(function(response) {
    foo = "foobar";

    // You can use all other form of array walk.
    for(var i = 0; i < callbackList.length; i++){
        callbackList[i](foo)
    }
});

module.exports = function(cb){
    if(typeof foo != 'undefined'){
        cb(foo); // If foo is already define, I don't wait.
    } else {
        callback.push(cb);
    }
}

ここで async.function は非同期呼び出しを象徴する単なるプレースホルダーです。

メインで

var fooMod = require('./foo.js');
fooMod(function(foo){
    //Here code using foo;
});

プロミスの方法

Promiseを使って解決することもできます。この方法は、Promiseの設計上、複数の呼び出しをサポートしています。

var foo, callback;
module.exports = new Promise(function(resolve, reject){
    async.function(function(response) {
        foo = "foobar"

        resolve(foo);
    });
});

ここで async.function は非同期呼び出しを象徴する単なるプレースホルダーです。

メインで

var fooMod = require('./foo.js').then(function(foo){
    //Here code using foo;
});

参照 Promiseのドキュメント