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 中的类型错误

xml2js:输出如何?

ReferenceError:全局未在xml2js中定义

MongoError:存储由 xml2js 模块生成的 JSON 对象时,键 $ 不能以 '$' 开头

损坏的文件 - Angular 项目中 node_modules 中的 .xml2js.DELETE/package,json

使用 xml2js parseString 返回值