我正在解析Node.js类中的硬编码xml结构。问题是解析是异步完成的,这导致该方法返回默认值(null)。
function Codeorder() {
// Hardcodet XML-tree as string
this.order = " <root>
<order instancename="flashlibraries" opens="true" />
<order instancename="TESTTEST" opens="true" />
<order instancename="flashlibraries" opens="false" />
</root>";
this.orderXML = null;
}
Codeorder.prototype.getOrderedCodepieces = function(instancename) {
var parseString = require('xml2js').parseString;
parseString(this.order, function (err, result) {
return result; // This doesn't work
});
// Return "All OK";
}
module.exports = Codeorder;
如何让方法等待解析器完成,然后返回XML内容?
免责声明:您想要的可以实现,但它可能不适用于未来版本的xml2js。
Codeorder.prototype.getOrderedCodepieces = function(instancename) {
var parseString = require('xml2js').parseString;
var ret = {};
parseString(this.order, {async: false}, function(err, data) {
ret.err = err;
ret.data = data;
});
if (ret.err) {
throw ret.err;
}
return ret.data;
}
一旦你做了这个改变,你就可以得到你想要的数据作为getOrderedCodepieces()
的返回值:
var c = new Codeorder();
var data = c.getOrderedCodepieces();
console.log(JSON.stringify(data, null, 2));
这依赖于所支持的解析器的async
选项。如文档中所述,将来可能会更改:
sync(默认为false):回调应该是异步的吗?这可能是如果您的代码依赖于的同步执行,则不兼容更改回调。xml2js的未来版本可能会改变这个