How can I best handle a situation like the following?
I have a constructor that takes a while to complete.
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.
I see three options, each of which seem out of the ordinary.
One, add a callback to the constructor.
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);
});
Two, use EventEmitter to emit a 'loaded' event.
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);
});
Or three, block the constructor.
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)
But I haven't seen any of this done before.
What other options do I have?
 
     
     
     
     
     
     
    