我想以异步方式初始化模块并提出一些想法。我需要带有来自 Mongo 和其他数据的集合列表的 DB 对象,但./
为了简洁起见,其中的文件列表会做。
我无法导出函数或类,因为我require('db')
每次都需要返回相同的对象。
首先,我想到的最简单的方法是稍后分配module.exports
并Object
填充它:
var exports = {};
module.exports = exports;
require('fs').readdir('.', function(err, files) {
exports.error = err;
exports.files = files;
});
坏事——我真的不知道从外面什么时候列表准备好了,也没有检查错误的好方法。
我想出的第二种EventEmitter
方法是继承并通知每个人数据库已准备好或发生错误。如果一切正常 - 继续。
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!
});
我应该选择什么,为什么?这种想法总体上有多糟糕,尤其是我的选择?
感谢您的反馈。