Me gustaría inicializar el módulo de manera asíncrona y proponer algunas ideas. Necesito el objeto DB con la lista de colecciones de Mongo y otros datos, pero la lista de archivos en ./
servirá para abreviar.Inicialización asincrónica del módulo Node.js
No puedo exportar la función o la clase porque necesito require('db')
para devolver el mismo objeto cada vez.
Primera y más simple lo que vino a la mente es asignar a module.exports
Object
y rellenarla después:
var exports = {};
module.exports = exports;
require('fs').readdir('.', function(err, files) {
exports.error = err;
exports.files = files;
});
Lo malo - que no se sabe muy bien desde el exterior cuando la lista está listo y no hay una buena manera de verificar si hay errores.
Segunda manera que he ComEd con EventEmitter
es heredar y notificar a todos que DB está preparado o se produjo el error. Si todo está bien, sigue.
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();
Y ahora creo que es más razonable:
// 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!
});
¿Qué debo escoger y por qué? ¿Qué tan mala es esa idea en general y mis opciones en particular?
Gracias por su comentario.
Las promesas no te ayudan con "múltiples resultados diferentes". Las promesas lo ayudan a sincronizar tanto los errores como los resultados adecuados cuando tiene múltiples resultados asincrónicos que otra cosa necesita para usar los resultados de. Así que editaría las promesas como parte de esa cita, porque no es correcto –