2015-05-06 6 views
11

Ich verwende ein Knotenmodul, das die Node-Callback-Konvention verwendet. Ich möchte dieses Modul mit Bluebird-Versprechen in eine API konvertieren. Ich verstehe nicht, wie ich das machen soll.Bluebird Versprechen `promisifyAll` funktioniert nicht - kann Eigenschaft` `dann` nicht lesen

Unten ist meine Node-Stil Callback-Funktion. Ich möchte es in ein vernünftiges Versprechen von Bluebird verwandeln.

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

Ich habe versucht, auf diese Weise PromisifyAll verwenden, aber es funktioniert nicht:

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

Ich then is not a function Fehler bekommen. Wie kann ich es reparieren?

Antwort

17

Wenn drossel ein Modul (wie xml2js) verwandelt sich in ein Versprechen basierte API promisifyAll dann fügt es ein Async Suffix an jeden Funktionsnamen und fügt diese Funktion in diesem Objekt:

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

Wenn Sie parseString aufrufen, ohne Das async-Suffix ruft die ursprüngliche Callback-basierte Funktion auf.

+0

Ich verwendete promisifyAll mit Anforderung, und es erforderte mir nicht, das Async-Suffix hinzuzufügen. Gibt es einen besonderen Grund? – Antoine

+0

@AnthonyMayfield Ich denke, Request-Modul ist standardmäßig mit Versprechen Konzepte gemacht. Ich habe es auf Anfrage benutzt, ohne es zu promoten –