承诺 xml2js 解析功能(ES6 承诺)
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' ] } }
根据这个问题的第一个答案How do I convert an existing callback API to promises?,我尝试按以下方式使用 promises 包装 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 做到这一点。
您需要像这样总结它:
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 个问题...
如果通过,你必须用一个值来解决...当它失败时,你必须用一个错误来拒绝
您需要向承诺处理链添加一个 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);
另一种选择是使用本机 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 ..);
我可能来不及回答这个问题,但我想分享一下我一直在使用的东西
可以在 async
函数中使用 xml2js
的 parseStringPromise
方法和 await
关键字。
import { parseStringPromise } from 'xml2js'
export const main = async () => {
const leadsData = await parseStringPromise(docBody)
console.log(leadsData)
}
我正在尝试重构一些节点代码,这些代码是一堆乱七八糟的回调。我认为为此目的尝试承诺会很好。我正在尝试使用 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?,我尝试按以下方式使用 promises 包装 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 做到这一点。
您需要像这样总结它:
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 个问题...
如果通过,你必须用一个值来解决...当它失败时,你必须用一个错误来拒绝
您需要向承诺处理链添加一个 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);
另一种选择是使用本机 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 ..);
我可能来不及回答这个问题,但我想分享一下我一直在使用的东西
可以在 async
函数中使用 xml2js
的 parseStringPromise
方法和 await
关键字。
import { parseStringPromise } from 'xml2js'
export const main = async () => {
const leadsData = await parseStringPromise(docBody)
console.log(leadsData)
}