【发布时间】:2012-08-05 02:32:56
【问题描述】:
如何才能最好地处理以下情况?
我有一个需要一段时间才能完成的构造函数。
var Element = function Element(name){
this.name = name;
this.nucleus = {};
this.load_nucleus(name); // This might take a second.
}
var oxygen = new Element('oxygen');
console.log(oxygen.nucleus); // Returns {}, because load_nucleus hasn't finished.
我看到了三个选项,每个选项看起来都不寻常。
一个,给构造函数添加回调。
var Element = function Element(name, fn){
this.name = name;
this.nucleus = {};
this.load_nucleus(name, function(){
fn(); // Now continue.
});
}
Element.prototype.load_nucleus(name, fn){
fs.readFile(name+'.json', function(err, data) {
this.nucleus = JSON.parse(data);
fn();
});
}
var oxygen = new Element('oxygen', function(){
console.log(oxygen.nucleus);
});
二,使用 EventEmitter 来发出 'loaded' 事件。
var Element = function Element(name){
this.name = name;
this.nucleus = {};
this.load_nucleus(name); // This might take a second.
}
Element.prototype.load_nucleus(name){
var self = this;
fs.readFile(name+'.json', function(err, data) {
self.nucleus = JSON.parse(data);
self.emit('loaded');
});
}
util.inherits(Element, events.EventEmitter);
var oxygen = new Element('oxygen');
oxygen.once('loaded', function(){
console.log(this.nucleus);
});
或者三个,阻塞构造函数。
var Element = function Element(name){
this.name = name;
this.nucleus = {};
this.load_nucleus(name); // This might take a second.
}
Element.prototype.load_nucleus(name, fn){
this.nucleus = JSON.parse(fs.readFileSync(name+'.json'));
}
var oxygen = new Element('oxygen');
console.log(oxygen.nucleus)
但我以前从未见过这样做过。
我还有什么其他选择?
【问题讨论】:
-
阻塞构造函数意味着阻塞一切,所以我可能不会那样做。
-
选项 1 和 2 实际上是相同的方法。您将加载处理程序传递给构造函数,并且该处理程序从 readFile 回调中触发。这就是基于事件的编程的工作原理(这就是 JavaScript/Node 的本质)。您可以使用选项 1 或 2,或主题的任何其他变体,但实际上您会获得相同的异步行为。
-
我从这个“问题”中学到的东西比给出的答案要多得多。为“信息性问题”+1!
-
只有一件事。在这种情况下使用
.once()而不是.on()。感觉更好:)。 -
我正在寻找一种方法来阻止 ES6 类,这可能吗?谢谢
标签: javascript node.js asynchronous constructor