如何承诺我使用 NodeJS Bluebird 创建的常规函数​​?

How to promisify a regular function that I created with NodeJS Bluebird?

我第一次使用 Mongoose 方法调用测试了 Bluebird。这很简单,只需要做 Promise.promisifyAll(myObj) 之类的事情,然后调用 myObj.methodAsync

但是当我尝试在没有Mongoose的情况下实现它时,我不知道该怎么做,例如:

function Foo(){}

Foo.prototype.test = function(c,cb){
  cb(new Error(),{a:1, b:2, c:c});
};

module.exports = new Foo();

这会在 then 中引发此错误。

Unhandled rejection (<{"a":1,"b":2,"c":true}>, no stack trace).

这会去 catch,我可以在那里毫无错误地使用它。

任何人都知道如何实现我的方法以很好地与 promise 实现一起工作?

您的回电正在返回 new Error(),只需使用 cb(null, {a:1, b:2,c:c});

在节点回调中,回调的第一个参数是一个可选错误。如果在第一个参数中返回一个参数,则表示函数失败。 promisify 只是将你的函数包装在一个 promise 中,当你的函数 returns,如果它在第一个位置发现错误,它将拒绝这个 promise。

您的函数在编写时运行得非常好,但它等同于同步领域的以下内容:

function alwaysThrows() { throw new Error() }