2016-03-02 2 views
0

Я пытаюсь реорганизовать некоторый код узла, который является полным беспорядком обратных вызовов. Я думал, что было бы неплохо дать обещания попробовать для этой цели. Я пытаюсь преобразовать некоторую строку xml в json с модулем узла xml2js. Исходный код был:Promisifying xml2js parse function (ES6 Promises)

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

Это отображает undefined через консоль вместо объекта json, как ожидалось. Я не понимаю, почему это происходит, поскольку я смог успешно сделать то же самое с другими функциями. Я знаю, что нечто подобное может быть достигнуто благодаря функциональности 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. Вам нужно добавить блокирующий блок, чтобы обезопасить цепочку, чтобы поймать ошибки.

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); 
Смежные вопросы