微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 使用bluebird创建支持节点回调和承诺的节点库

我正在创建一个节点模块,我希望能够支持节点回调和Promise API.我听到最好的东西(主要是它是最快的)的库是 bluebird.所以在阅读了一些文档并查看其他一些使用蓝鸟的库之后,我认为这将是获得方法支持的最简洁方法节点回调和Promise API:

this.isAllowed = function(role,resource,permission,callback) {
  var isAllowedAsync = bluebird.promisify(isAllowed);
  return isAllowedAsync(role,permission).nodeify(callback);
};

但是使用此代码,回调永远不会执行.经过一些研究,我尝试了这个:

this.isAllowed = function(role,callback) {
  return new bluebird(function (resolve,reject) {
    resolve(isAllowed(role,permission));
  }).nodeify(callback);
};

使用该代码,节点回调和Promise API都可以工作.

作为参考,这是isAllowed方法

var isAllowed = function(role,permission) {
  if(!lists[role] || !lists[role][resource]) {
    return false;
  }

  return lists[role][resource].indexOf(permission) !== -1;
};

我在第一个代码示例中做错了什么,或者第二个例子是获得我正在寻找的东西的真正方式?

解决方法

你的具体问题毫无意义(请参阅我的评论),所以我只是通用的.有两种方法可以公开双承诺/回调API.

第一种方法是同时使用相同的函数支持promises和callbacks,如果没有传递callback参数则返回promise,如果传递则使用回调.

然而,这很难实现,并且当某些参数是可选的时可能会有一些令人讨厌的问题.

要实现它,除了在返回的链的末尾添加.nodeify之外,您执行与使用100%promise函数完全相同的操作.

// 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.这很容易实现,实际上几乎没有理由这样做,因为如果用户使用蓝鸟,用户可以很容易地自己宣传模块.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐