Asynchroner Konstruktor

Wie kann ich am besten umgehen einer situation wie der folgenden?

Ich habe einen Konstruktor, der eine Weile dauert, um abzuschließen.

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.

Sehe ich drei Optionen, von denen jeder scheint sich von den gewöhnlichen.

Einefügen Sie eine callback-Funktion an den Konstruktor.

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);
});

Zweiverwenden Sie EventEmitter ausstrahlen 'geladen' 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);
});

Oder dreiblockieren Sie den Konstruktor.

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)

Aber ich habe nicht gesehen, alle dies getan haben, bevor.

Welche anderen Möglichkeiten habe ich?

InformationsquelleAutor der Frage Luke Burns | 2012-08-08

Schreibe einen Kommentar