蓝鸟PromisifyAll没有任何asynchronous后缀,即取代原来的function可能?

Bluebird有一个promisifyAll函数,它“通过遍历对象的属性来提升整个对象,并在对象及其原型链上创build每个函数的asynchronous等价物”。

它使用后缀Async创build函数。

是否有可能完全取代旧的function? 被replace的函数就像原来的函数一样工作,另外它们也返回一个Promise,所以我认为完全replace旧函数应该是安全的。

 var object = {}; object.fn = function(arg, cb) { cb(null,1) }; Bluebird.promisifyAll(object); object.fn // do not want object.fnAsync // => should replace `object.fn` 

有一个选项来指定一个自定义后缀选项,但不幸的是它不适用于空string

 Bluebird.promisifyAll(object, {suffix: ''}); RangeError: suffix must be a valid identifier 

       

网上收集的解决方案 "蓝鸟PromisifyAll没有任何asynchronous后缀,即取代原来的function可能?"

问题是,如果它走的原型和地方*Asyncfunction – 您将需要原型链中的每个对象的全新副本,这可能会失败,因为库返回自己的对象。

也就是说,如果你使用的是Mongoose,而且你得到了一个集合对象 – 库不知道要返回promisified的版本 – 你有自己的promisified版本的副本,但是库不会很好。 另外,库也调用它自己的函数,改变他们的签名会破坏很多内部代码。

当然,如果你只需要一个层次你不需要关心原型, 而且你不关心内部调用 – 你可以很容易的完成它:

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

理解这一点很重要,但这不是通常的情况。 还有其他的应用(比如,如果你忽略了callback,使得函数返回一个promise),但是通常它们不是很可靠。