如何在带有xml2js的Nodejs中使用函数回调

时间:2015-01-28 15:38:05

标签: javascript node.js callback

我使用xml2js来解析Nodejs中的XML文档。

XML文件是远程托管的,因此我使用Node.js http请求获取xml数据,然后使用xml2js解析它:

var parser = new xml2js.Parser();

function getValue(){
    var options = {
      hostname: myHost,
      path: myPath,
      method: 'GET',
      headers: {
          'Authorization': myAuthString
      }
    };

    var req = http.request(options, function(res) {
      res.on('data', function (response) {
        parser.parseString(response); 
      });
    });
    req.end();
}
parser.on('end', function(result) {
    // Output the distribution plans to console
     eyes.inspect(result);
     // Get the value that I want to use
     var returnThis = result['myKey'];
});

以上代码有效,当http请求收到"数据时,我得到XML数据"事件,然后xml2js解析器解析XML,我得到"结束"解析事件。

我的问题是,如何使用回调来返回" returnThis"变量值回到getValue函数?

例如,如果我从XML中检索人名,我希望这可以工作:

console.log("The returned name is: " + getValue());

非常感谢任何建议! TIA!

2 个答案:

答案 0 :(得分:1)

尝试以下方法:

function getValue(callback){
    var options = {
      hostname: myHost,
      path: myPath,
      method: 'GET',
      headers: {
          'Authorization': myAuthString
      }
    };

    var req = http.request(options, function(res) {
      var parser = new xml2js.Parser();
      parser.on('end', function(result) {
        // Output the distribution plans to console
        eyes.inspect(result);
        callback(null, result['myKey'])
      });
      res.on('data', function (response) {
        parser.parseString(response); 
      });
    });
    req.end();
}

要使用您的功能,您需要按照以下方式调用您的功能:

getValue(function(err, res){
  // res should equal myKey
  console.log(res)

})

答案 1 :(得分:0)

事件的例子

var emitter = require('events').EventEmitter,
    parseEmitter = new emitter();
function getValue(trigger){
    var options = {
      hostname: myHost,
      path: myPath,
      method: 'GET',
      headers: {
          'Authorization': myAuthString
      }
    };

    var req = http.request(options, function(res) {
      var parser = new xml2js.Parser();
      parser.on('end', function(result) {
        // Output the distribution plans to console
        eyes.inspect(result);
        callback(null, result['myKey'])
      });
      res.on('data', function (response) {
        parser.parseString(response); 
      });
    });
    parser.on('end', function(result) {
      // Output the distribution plans to console
      eyes.inspect(result);
      // Get the value that I want to use
      var returnThis = result['myKey'];
      trigger.emit('log', returnThis);
    });
    req.end();
}
parseEmitter.on('log', function(value) {
  console.log('The return name is '+value);
}
getValue(parseEmitter);