如何承诺我使用 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() }
我第一次使用 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() }