我正在创建一个节点模块,我希望能够支持节点回调和Promise API。我听到最好的东西(主要是最快的)的图书馆是bluebird。因此,在阅读了一些文档并查看其他一些使用bluebird的库之后,我认为这将是获得支持节点回调和Promise API的方法的最简洁方法:
this.isAllowed = function(role, resource, permission, callback) {
var isAllowedAsync = bluebird.promisify(isAllowed);
return isAllowedAsync(role, resource, permission).nodeify(callback);
};
但是使用此代码,永远不会执行回调。经过一些研究,我尝试了这个:
this.isAllowed = function(role, resource, permission, callback) {
return new bluebird(function (resolve, reject) {
resolve(isAllowed(role, resource, permission));
}).nodeify(callback);
};
使用该代码,节点回调和Promise API都可以工作。
作为参考,这是isAllowed方法:
var isAllowed = function(role, resource, permission) {
if(!lists[role] || !lists[role][resource]) {
return false;
}
return lists[role][resource].indexOf(permission) !== -1;
};
我在第一个代码示例中做错了什么,或者第二个例子是获取我要找的东西的真正方法?
答案 0 :(得分:13)
您的具体问题毫无意义(请参阅我的评论),所以我只是通用的。有两种方法可以公开双承诺/回调API。
第一种方法是同时使用相同的函数支持promises和callbacks,如果没有传递callback参数则返回promise,如果传递则使用回调。
然而,这很难实现,并且当某些参数是可选的时,会出现一些令人讨厌的问题。
要实现它,除了在返回的链的末尾添加.nodeify
之外,您执行与使用100%承诺函数完全相同的操作。
// Note however this doesn't work if some arguments before
// `callback` are optional
function dualApi(..., callback) {
// acting as if you would never support callbacks at all
return getPromise()
.then(...)
.then(...)
.then(...)
// .nodeify at the end of the chain, NOWHERE else
.nodeify(callback)
}
第二种方法是定义一个普通的回调api,然后调用promisifyAll
。这很容易实现,实际上几乎没有理由这样做,因为如果用户使用蓝鸟,用户可以很容易地自己宣传模块。