我想以異步方式初始化模塊,並提出幾個想法。我需要包含來自Mongo和其他數據的收藏列表的數據庫對象,但爲了簡潔起見,./
中的文件列表將盡其所能。Node.js模塊的異步初始化
我無法導出函數或類,因爲我需要require('db')
每次都返回相同的對象。
首先也是最簡單的東西來到我的腦海裏是分配給module.exports
和Object
後來填充它:
var exports = {};
module.exports = exports;
require('fs').readdir('.', function(err, files) {
exports.error = err;
exports.files = files;
});
壞事 - 我真的不從外部知道名單是準備並沒有好方法來檢查錯誤。
二的路我COMED了將繼承EventEmitter
,並通知大家,DB是準備或發生錯誤。如果一切正常 - 繼續前進。
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!
});
我應該怎麼挑,爲什麼?一般來說這種想法有多糟糕,特別是我的選擇?
感謝您的反饋意見。
承諾不會幫助你「多個不同的結果」。如果有多個異步結果需要其他結果使用,那麼Promises可以幫助您同步錯誤和正確的結果。所以我會編輯引用中的承諾部分,因爲它不正確 – 2013-08-10 21:02:45