[解決済み] 非同期nodejsモジュールエクスポート
質問
以下の例の "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;
});
関連
-
[解決済み】Express.js req.bodyが未定義です。
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] http-server コマンドが見つかりません。
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
-
[解決済み] 関数内で変数を変更した後、変数が変更されないのはなぜですか?- 非同期コードリファレンス
-
[解決済み] Node.jsのmodule.exportsとexportsの比較
-
[解決済み] Node.jsで "Cannot find module "エラーを解決するにはどうしたらいいですか?
-
[解決済み] JavaScript, Node.js: Array.forEachは非同期なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】passport.js passport.initialize() ミドルウェアが使用されていません。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] bodyParser は非推奨です express 4
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?
-
[解決済み] Mongoose Schema がモデルとして登録されていません。