2013-03-18 6 views
0

Я использую nodejs и модуль xml2js. Я читаю XML-файл и пытаюсь передать событие после преобразования xml в объект json. Мой код выглядит так:Как передать область функций обратного вызова в nodejs?

var fs = require('fs'), 
util = require('util'), 
events = require('events'), 
xml2js = require('xml2js'); 

var CIRCUITMODELSFILENAME = "ControlCircuitModels.xml"; 
var CIRCUITPARTMODELSFILENAME = "ControlCircuitParts.xml"; 
var circuitModels, circuitPartModels; 


function ModelController() { 
    if (false === (this instanceof ModelController)) { 
     return new ModelController(); 
    } 
    events.EventEmitter.call(this); 
}; 


util.inherits(ModelController, events.EventEmitter); 


ModelController.prototype.load = function (baseDir) { 

    var parser = new xml2js.Parser({ 
     normalize: true, 
     trim: true, 
     explicitArray: false 
    }); 

    fs.readFile(baseDir + "/" + CIRCUITMODELSFILENAME, function (err, data) { 
     parser.parseString(data, function (err, result) { 
      circuitModels = result; 
      console.log('circuit models loaded'); 
      parser.reset(); 
      fs.readFile(baseDir + "/" + CIRCUITPARTMODELSFILENAME, function (err, data) { 
      parser.parseString(data, function (err, result) { 
       circuitPartModels = result; 
       console.log('circuit part models loaded'); 
       moduleReady = true; 
       this.emit("modelsloaded", null); 
       }); 
      }); 
     }); 
    }); 
}; 

// public interface 
exports.ModelController = ModelController; 

Проблема в том, что область при испускании события теряется.

this.emit("modelsloaded", null); 

Это не унаследовало излучение от EventEmitter.

Как передать область действия функции parser.parseString?

Благодаря Chris

ответ

0

Не уверен, что это лучшее решение, бис это работает (не смотрите прямо Предисловие):

fs.readFile(baseDir + "/" + CIRCUITMODELSFILENAME, function (err, data) { 
    parser.parseString(data, function (err,result) { 
     circuitModels = result; 
     parser.reset(); 
     fs.readFile(baseDir + "/" + CIRCUITPARTMODELSFILENAME, function (err, data) { 
      circuitPartModels = result; 
      console.log('circuit models loaded'); 
      parser.parseString(data, function (err, result) { 
       console.log('circuit part models loaded'); 
       this.emit("modelsloaded", null); 
       moduleReady = true; 
       circuitPartModels = result; 
      }.bind(this)); 
     }.bind(this)); 
    }.bind(this)); 
}.bind(this)); 
Смежные вопросы