Vorrei inizializzare il modulo in modo asincrono e proporre un paio di idee. Ho bisogno di un oggetto DB con l'elenco delle raccolte da Mongo e altri dati, ma l'elenco dei file in ./
farà per brevità.Inizializzazione asincrona del modulo Node.js
Non riesco a esportare la funzione o la classe perché ho bisogno di require('db')
per restituire sempre lo stesso oggetto.
Prima e più semplice che cosa è venuto in mente è quello di assegnare module.exports
-Object
e popolare in un secondo momento:
var exports = {};
module.exports = exports;
require('fs').readdir('.', function(err, files) {
exports.error = err;
exports.files = files;
});
Brutta cosa - io non so davvero dall'esterno quando la lista è pronta e non è un buon modo per controllare gli errori.
Seconda modo ho Comed in mente è di ereditare EventEmitter
e notificare a tutti che DB è pronto o errore. Se tutto ok, continua.
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();
E ora penso che sia più ragionevole:
// 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!
});
Cosa devo scegliere e perché? Quanto è grave questa idea in generale e le mie opzioni in particolare?
Grazie per il feedback.
Le promesse non ti aiutano con "più risultati diversi". Le promesse aiutano a sincronizzare sia gli errori che i risultati corretti quando si hanno più risultati asincroni che qualcos'altro ha bisogno di usare i risultati di. Quindi modificherei la parte promesse da quella citazione, perché non è corretta –