2015-05-06 14 views
11

Używam modułu węzła, który używa konwencji wywołania zwrotnego węzła. Chcę przekonwertować ten moduł na API za pomocą obietnic Bluebird. Nie rozumiem, jak to zrobić.Obietnica Bluebird `promisifyAll` nie działa - nie można odczytać właściwości` then`

Poniżej znajduje się funkcja wywołania zwrotnego w stylu węzła. Chcę go przekonwertować na obiecującą gwarancję Bluebirda.

var module = require('module'); // for example xml2js, or Mongoose 
var parseString = xml2js.parseString; 
    parseString(xml, function (err, result) { // the regular API 
     if (err) { 
     console.log("Error in generation json from xml"); 
     } else { 
     return result; 
     } 
    }); 

Próbowałem w ten sposób przy użyciu PromisifyAll ale to nie działa:

var module = Promise.promisifyAll(require('module')); // for example xml2js 
xml2js.parseString(xml) 
     .then(function (result) { 
      console.log("result = ", result); 
     }) 
     .catch(function (err) { 
      console.err(err); 
     }); 

Dostaję then is not a function błędów. Jak mogę to naprawić?

Odpowiedz

17

Kiedy Bluebird przekształca moduł (jak xml2js) do API opartego obietnicy wykorzystaniem promisifyAll potem dołącza się Async przyrostek do każdej nazwy funkcji i dodaje tę funkcję do tego obiektu:

var xml2js = Promise.promisifyAll(require('xml2js')); // example: xml2js 
xml2js.parseStringAsync(xml) // NOTE THE ASYNC SUFFIX 
     .then(function (result) { 
      console.log("result = " + JSON.stringify(result)); 
     }) 
     .catch(function (err) { 
      console.err(err); 
     }); 

gdy dzwonisz parseString bez asynchroniczny, wywołuje oryginalną funkcję opartą na oddzwanianiu.

+0

Używałem promisifyAll z prośbą i nie wymagało to dodania sufiksu Async. Czy jest jakiś szczególny powód? – Antoine

+0

@AnthonyMayfield Myślę, że moduł żądania jest domyślnie wykonany przy użyciu koncepcji obietnicy. Użyłem. Then na żądanie, nie obiecując go –

Powiązane problemy