蓝鸟承诺“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”的主要内容,如果未能解决你的问题,请参考以下文章