【问题标题】:Bluebird PromisifyAll without any Async suffix, i.e. replace the original functions possible?Bluebird PromisifyAll 没有任何 Async 后缀,即可以替换原来的函数吗?
【发布时间】:2015-08-16 13:13:44
【问题描述】:

Bluebird 有一个promisifyAll 函数,它“通过遍历对象的属性并创建对象及其原型链上每个函数的异步等效项来承诺整个对象。”

它创建带有后缀Async 的函数。

是否可以完全替换旧功能?被替换的函数就像原来的函数一样工作,除了它们也返回一个 Promise,所以我认为完全替换旧函数应该是安全的。

var object = {};
object.fn = function(arg, cb) { cb(null,1) };
Bluebird.promisifyAll(object);

object.fn      // do not want 
object.fnAsync // => should replace `object.fn`

有一个选项可以指定自定义后缀选项,但不幸的是它不适用于空字符串

Bluebird.promisifyAll(object, {suffix: ''});

RangeError: suffix must be a valid identifier

【问题讨论】:

  • 我认为,您应该在bluebird issues tracker 上发布功能请求。
  • 我认为这是不可能的,因为目前的 promisification 确实创建了只调用 this.fn(…) 的方法,因此如果您覆盖 fn,它们将陷入无限递归。

标签: javascript node.js promise bluebird


【解决方案1】:

问题在于,如果它遍历原型并放置 *Async 函数 - 您将需要原型链中每个对象的全新副本,这可能会失败,因为库返回它们自己的对象。

也就是说 - 如果您使用 Mongoose 并且您正在获取一个集合对象 - 库将不知道返回承诺版本 - 您将拥有自己的承诺版本副本,但库不会播放很好。此外,库也调用自己的函数,更改它们的签名会破坏很多内部代码。

当然,如果你只需要一层深度并且你不关心原型并且你不关心内部调用 - 你可以轻松完成它:

Object.getOwnPropertyNames(object).forEach(function(key){
    object[key] = Promise.promisify(object[key]);
});

重要的是要明白这不是常见的情况。还有其他方法(例如,如果您省略回调,则使函数返回一个承诺),但通常它们不是很可靠。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-12-03
    • 2018-10-11
    相关资源
    最近更新 更多