Promisifying xml2js parse function (ES6 Promises)
Promisifying xml2js parse function (ES6 Promises)
我正在尝试重构一些节点代码,这些代码是一大堆回调。我认为为此目的尝试一下承诺会很好。我正在尝试使用 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' ] } }
在回答这个问题的第一个答案之后,如何将现有的回调 API 转换为承诺?我尝试通过以下方式使用承诺包装 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);
});
这将通过控制台显示undefined
,而不是按预期显示 json 对象。我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情。我知道Bluebird promisify功能可以实现类似的事情,但我想在没有任何第三方库的纯Javascript上做到这一点。
另一种选择是使用本机util
模块的promisify
方法,该方法可从 Node 8.0 获得:
const xml2js = require('xml2js');
const util = require('util');
xml2js.parseStringPromise = util.promisify(xml2js.parseString);
// await xml2js.parseStringPromise(.. your xml ..);
你需要像这样包装它:
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
});
有 2 个问题...
-
如果它通过,您必须使用值进行解析...并在失败时拒绝并显示错误
-
您需要添加一个捕获块,以承诺处理链以捕获错误。
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);
我可能为时已晚,但我想分享我一直在使用的东西
可以在async
函数中使用parseStringPromise
带有关键字await
xml2js
方法。
import { parseStringPromise } from 'xml2js'
export const main = async () => {
const leadsData = await parseStringPromise(docBody)
console.log(leadsData)
}
相关文章:
- ES6构造函数返回基类的实例
- 如何在下面的ES6循环中获得前面的文本
- 可以简化嵌套的延迟Q Promises解析吗
- es6 相当于下划线查找位置
- 如何在Javascript/ES6中的Aurelia浏览器应用程序中使用AWS S3
- ES6生成器:.next()的输入值
- 简单的ES6承诺问题-交换解决和拒绝参数
- 映射数组ES6时考虑空值
- @@(“at at”)在ES6 JavaScript中是什么意思
- 为什么javascript ES6 Promises在解析后继续执行
- ES6 Promises in Mocha
- ES6-Promises在使用Node MySQL时出现故障
- 将ES6 Promises与JQuery Promises混合使用
- Promisifying xml2js parse function (ES6 Promises)
- jQuery ajax with ES6 Promises
- 如何在解决所有javascript ES6 Promises后运行
- 理解使用ES6 Promises时的操作顺序
- 使用React Redux API在Mongoose中链接ES6 Promises
- ES5 vs ES6 Promises
- 使用Callback加载数据.有没有更好的解决方案使用ES6 Promises ?