繁体   English   中英

承诺 xml2js 解析 function(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' ] } }

在这个问题的第一个答案之后如何将现有回调 API 转换为承诺? 我尝试通过以下方式使用 promises 包装 xml2jsParser function:

"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 object。 我不明白为什么会发生这种情况,因为我能够成功地对其他功能执行相同的操作。 我知道使用 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个问题...

  1. 如果它通过,你必须用一个值来解决......当它失败时,你必须用一个错误来拒绝

  2. 您需要向 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);

我可能来不及回答这个问题,但我想分享一下我一直在使用的东西

可以在async function 中使用带有await关键字的xml2jsparseStringPromise方法。

import { parseStringPromise } from 'xml2js'

export const main = async () => {
    const leadsData = await parseStringPromise(docBody)
    console.log(leadsData)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM