Promisifying xml2js解析函数(ES6 Promises)

时间:2016-03-02 19:32:43

标签: 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);
});

,显示:

{ 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);
});

这将通过控制台而不是json对象按预期显示undefined。我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情。我知道使用Bluebird promisify功能可以实现类似的功能,但我想在没有任何第三方库的情况下在普通的Javascript上执行此操作。

3 个答案:

答案 0 :(得分:5)

你需要像这样把它包起来:

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
});

答案 1 :(得分:5)

另一种选择是使用本机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 ..);

答案 2 :(得分:3)

有两个问题......

  1. 如果传递了值,则必须使用值解析...并在失败时拒绝并显示错误

  2. 您需要向承诺处理链添加一个catch块以捕获错误。

  3. var xml2jsParser = require(&#39; xml2js&#39;)。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);