Dan*_*ero 1 javascript json node.js promise es6-promise
我正在尝试重构一些节点代码,这些代码是一堆乱七八糟的回调.我认为为了这个目的,尝试承诺会很好.我正在尝试使用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);
});
Run Code Online (Sandbox Code Playgroud)
这显示:
{ container: { tag1: [ 'option1' ], tag2: [ 'option2' ], tag3: [ 'option3' ] } }
Run Code Online (Sandbox Code Playgroud)
关于这个问题的第一个答案如何将现有的回调API转换为承诺?我尝试使用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);
});
Run Code Online (Sandbox Code Playgroud)
这将undefined通过控制台显示,而不是按预期显示在json对象上.我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情.我知道使用Bluebird promisify功能可以实现类似的功能,但我想在没有任何第三方库的情况下在普通的Javascript上执行此操作.
另一种选择是使用Node 8.0中可用的本机util模块的promisify方法:
const xml2js = require('xml2js');
const util = require('util');
xml2js.parseStringPromise = util.promisify(xml2js.parseString);
// await xml2js.parseStringPromise(.. your xml ..);
Run Code Online (Sandbox Code Playgroud)
你将需要像这样包装它:
return new Promise(function(resolve, reject)
{
xml2jsParser(string, function(err, result){
if(err){
reject(err);
}
else {
resolve(result);
}
});
});
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
promisesParser(string).then(function(result){
console.log(result);
}).catch(function(err){
//error here
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5082 次 |
| 最近记录: |