0

nodejs と xml2js モジュールを使用しています。XML ファイルを読み取っていて、xml が json オブジェクトに変換された後にイベントを発行しようとしています。私のコードは次のようになります:

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 関数に渡すにはどうすればよいですか?

ありがとうクリス

4

1 に答える 1

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));
于 2013-03-18T20:14:19.443 に答える