蓝鸟承诺“promisifyAll”不起作用 - 无法读取属性“then”

Posted

技术标签:

【中文标题】蓝鸟承诺“promisifyAll”不起作用 - 无法读取属性“then”【英文标题】:Bluebird promise `promisifyAll` not working - cannot read property `then` 【发布时间】:2015-07-16 00:42:32 【问题描述】:

我正在使用一个使用节点回调约定的节点模块。我想使用 Bluebird Promise 将此模块转换为 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 错误。我该如何解决?

【问题讨论】:

【参考方案1】:

当 bluebird 使用 promisifyAll 将模块(如 xml2js)转换为基于 Promise 的 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);
        );

当您调用不带 async 后缀的 parseString 时,它会调用原始的基于回调的函数。

【讨论】:

我在 request 中使用了 promisifyAll,它不需要我添加 Async 后缀。有什么特别的原因吗? @AnthonyMayfield 我认为请求模块默认是使用承诺概念制作的。我根据要求使用了 .then 而没有做出任何承诺

以上是关于蓝鸟承诺“promisifyAll”不起作用 - 无法读取属性“then”的主要内容,如果未能解决你的问题,请参考以下文章

蓝鸟承诺在快递路线解决

承诺中的 if-else 流程(蓝鸟)

无法得到我在 nodejs / mongoose / bluebird 中返回的承诺

蓝鸟承诺未定义?

蓝鸟,承诺,然后()

处理嵌套承诺的最佳方法(蓝鸟)[重复]