Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺xml2js解析函数(ES6承诺)_Javascript_Json_Node.js_Promise_Es6 Promise - Fatal编程技术网

Javascript 承诺xml2js解析函数(ES6承诺)

Javascript 承诺xml2js解析函数(ES6承诺),javascript,json,node.js,promise,es6-promise,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

我试图重构一些节点代码,这些代码是一堆回调。我想这是一个很好的尝试,为这个目的。我正在尝试使用
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);
});
在这个问题的第一个答案之后,我尝试使用承诺以以下方式包装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);
});
“严格使用”;
var xml2jsParser=require('xml2js').parseString;
功能承诺人(字符串)
{
返回新承诺(功能(解决、拒绝)
{
xml2jsParser(字符串,解析);
});
}
var string=“option3”;
允诺者(字符串)。然后(函数(错误,结果){
控制台日志(结果);
});

这将通过控制台显示
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
});
然后像这样使用它:

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
});
有两个问题

  • 如果通过,则必须使用值进行解析…如果失败,则必须使用错误进行拒绝

  • 您需要向处理链添加一个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);
    
    功能承诺人(字符串)
    {
    返回新承诺(功能(解决、拒绝)
    {
    xml2jsParser(字符串、函数(错误、结果){
    如果(错误){
    退货拒绝(err);
    }否则{
    返回解析(结果);
    }
    });
    });
    }
    var string=“option3”;
    承诺人(字符串)
    .then(console.log)
    .catch(console.log);
    
    另一个选项是使用本机
    util
    模块的
    promisify
    方法:


    使用该答案中的#3“节点样式回调”而不是#2“普通回调”。或者
    xml2js.Parser.prototype.parseStringPromise=util.promisify(xml2js.parseString)如果要实例化单独的解析器。或者直接在解析器实例上执行。@BrianJ.Miller更好