モジュールを非同期で初期化し、いくつかのアイデアを思いつきたいと思います。Mongo およびその他のデータからのコレクションのリストを含む DB オブジェクトが必要です./
が、簡潔にするためにファイルのリストで十分です。
require('db')
毎回同じオブジェクトを返す必要があるため、関数またはクラスをエクスポートできません。
最初に頭に浮かんだ最も簡単なことは、後で割り当てmodule.exports
てObject
入力することです。
var exports = {};
module.exports = exports;
require('fs').readdir('.', function(err, files) {
exports.error = err;
exports.files = files;
});
悪い点 — リストの準備が整ったときに、外部からは実際にはわかりません。また、エラーをチェックする良い方法もありません。
私が思いついた2 番目EventEmitter
の方法は、継承して、DB の準備ができているかエラーが発生したことを全員に通知することです。すべてがOKなら、続けてください。
var events = require('events');
var util = require('util');
function Db() {
events.EventEmitter.call(this);
this.ready = false;
this.files = null;
this.initialize();
}
util.inherits(Db, events.EventEmitter);
Db.prototype.initialize = function() {
if (this.ready)
return this.emit('ready');
var self = this;
require('fs').readdir('.', function(err, files) {
if (err)
return self.emit('error', err);
self.files = files;
self.ready = true;
self.emit('ready');
});
};
module.exports = new Db();
そして今、私はそれがより合理的だと思います:
// db.js
var exports = {init: init};
module.exports = exports;
function init(callback) {
callback = (typeof callback === 'function') ? callback : function() {};
require('fs').readdir('.', function(err, files) {
delete exports.init;
exports.result = files; // that's pretty much what I need,
// so don't mind result slightly differs
// from previous cases
callback(err);
});
}
// main.js
var db = require('./db');
// check for `db.init` presence maybe...
db.init(function(err) {
return err ? console.error('Bad!')
: console.log(db); // It works!
});
何を選ぶべきですか、なぜですか? そのようなアイデアは一般的に、特に私のオプションはどれほど悪いですか?
フィードバックありがとうございます。