Promisifying xml2js 解析函数(ES6 Promises)
Posted
技术标签:
【中文标题】Promisifying xml2js 解析函数(ES6 Promises)【英文标题】:Promisifying xml2js parse function (ES6 Promises) 【发布时间】:2016-06-15 20:25:18 【问题描述】:我正在尝试重构一些完全是回调的节点代码。我认为为此目的尝试一下承诺会很好。我正在尝试使用 xml2js
节点模块将一些 xml 字符串转换为 json。原来的代码是:
"use strict";
var xml2jsParser = require('xml2js').parseString;
var string = "<container><tag3>option3</tag3></container>";
xml2jsParser(string, function(err, result)
console.log(result);
);
然后显示:
container: tag1: [ 'option1' ], tag2: [ 'option2' ], tag3: [ 'option3' ]
在这个问题的第一个答案How do I convert an existing callback API to promises? 之后,我尝试通过以下方式使用 Promise 包装 xml2jsParser 函数:
"use strict";
var xml2jsParser = require('xml2js').parseString;
function promisesParser(string)
return new Promise(function(resolve, reject)
xml2jsParser(string, resolve);
);
var string = "<container><tag3>option3</tag3></container>";
promisesParser(string).then(function(err, result)
console.log(result);
);
这将通过控制台而不是预期的 json 对象显示 undefined
。我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情。我知道使用 Bluebird Promisify 功能可以实现类似的功能,但我想在没有任何第三方库的情况下在纯 javascript 上执行此操作。
【问题讨论】:
从那个答案中使用#3“节点样式回调”而不是#2“普通回调”。 【参考方案1】:另一种选择是使用原生util
模块的promisify
方法available from Node 8.0:
const xml2js = require('xml2js');
const util = require('util');
xml2js.parseStringPromise = util.promisify(xml2js.parseString);
// await xml2js.parseStringPromise(.. your xml ..);
【讨论】:
或xml2js.Parser.prototype.parseStringPromise = util.promisify(xml2js.parseString);
,如果您要实例化单独的解析器。或者直接在解析器实例上进行。
@BrianJ.Miller 那更好【参考方案2】:
你需要像这样把它包起来:
return new Promise(function(resolve, reject)
xml2jsParser(string, function(err, result)
if(err)
reject(err);
else
resolve(result);
);
);
然后像这样使用它:
promisesParser(string).then(function(result)
console.log(result);
).catch(function(err)
//error here
);
【讨论】:
【参考方案3】:有两个问题...
如果它通过了,你必须用一个值来解决......如果它失败,你必须用一个错误来拒绝
您需要在 Promise 处理链中添加一个 catch 块来捕获错误。
var xml2jsParser = require('xml2js').parseString;
function promisesParser(string)
return new Promise(function(resolve, reject)
xml2jsParser(string, function(err, result)
if (err)
return reject(err);
else
return resolve(result);
);
);
var string = "<container><tag3>option3</tag3></container>";
promisesParser(string)
.then(console.log)
.catch(console.log);
【讨论】:
以上是关于Promisifying xml2js 解析函数(ES6 Promises)的主要内容,如果未能解决你的问题,请参考以下文章
Promisifying Mongoose Connect 中的类型错误
MongoError:存储由 xml2js 模块生成的 JSON 对象时,键 $ 不能以 '$' 开头
损坏的文件 - Angular 项目中 node_modules 中的 .xml2js.DELETE/package,json