2013-03-18 119 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)); 
相关问题