Bluebird 承诺 `promisifyAll` 不起作用 - 无法读取 属性 `then`

Bluebird promise `promisifyAll` not working - cannot read property `then`

我正在使用一个使用节点回调约定的节点模块。我想使用 Bluebird 承诺将此模块转换为 API。我不知道该怎么做。

下面是我的节点样式回调函数。我想把它变成蓝鸟的承诺

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 错误。我该如何解决?

当 bluebird 使用 promisifyAll 将模块(如 xml2js)转换为基于 API 的承诺时,它会向每个函数名称附加一个 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时,它会调用原始的基于回调的函数。