2016-03-02 52 views
0

我想重构一些节点代码,这是一个回调的整个混乱。我认为这将是很好的承诺试试这个目的。我试图用xml2js节点模块将一些xml字符串转换为json。原来的代码是:promisifying xml2js解析函数(ES6承诺)

"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?第一个回答我试着换用承诺按以下方式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执行此操作。

+0

从该答案中使用#3“节点样式回调”而不是#2“普通回调”。 – Bergi

回答

3

您将需要将其包装起来是这样的:

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

有2个问题...

  1. 如果它通过,则必须使用值进行解析,并在发生故障时拒绝并显示错误

  2. 你需要添加一个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);