Я хотел бы инициализировать модуль асинхронным способом и создать пару идей. Мне нужен объект DB со списком коллекций из Mongo и других данных, но список файлов в ./
будет выполняться для краткости.
Я не могу экспортировать функцию или класс, потому что мне нужно 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 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!
});
Что я должен выбрать и почему? Насколько плохо такая идея вообще и мои варианты в частности?
Спасибо за отзывы.