Bluebird обещание `promisifyAll` не работает - невозможно прочитать свойство` then`

Я использую модуль node, который использует соглашение об обратном вызове node. Я хочу преобразовать этот модуль в API с помощью Bluebird promises. Я не понимаю, как это сделать.

Ниже приведена функция обратного вызова стиля node. Я хочу превратить его в надежное обещание синей птицы.

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

Я пробовал этот путь с помощью PromisifyAll, но он не работает:

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

Я получаю ошибки then is not a function. Как я могу это исправить?

Ответ 1

Когда bluebird преобразует модуль (например, xml2js) в API, основанный на обещании, используя promisifyAll, то он добавляет суффикс Async к каждому имени функции и добавляет эту функцию в этот объект:

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

Когда вы вызываете parseString без суффикса async, он вызывает исходную функцию на основе обратного вызова.