2013-03-18 55 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函數?

感謝 克里斯

回答

0

不知道這是最好的解決辦法,二本的作品(不看直foreward):

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