Bluebird PromisifyAll没有任何Async后缀,即可能替换原来的功能?

时间:2015-06-02 16:12:43

标签: javascript node.js promise bluebird

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

1 个答案:

答案 0 :(得分:7)

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

那就是 - 如果您正在使用Mongoose并且您正在获取一个集合对象 - 图书馆不知道会返回已宣传的版本 - 您拥有自己的版本的副本但是图书馆不会很好玩。此外,库也调用自己的函数,更改签名会破坏大量内部代码。

当然,如果您只需要一个级别,那么您不必关心原型,而您并不关心内部调用 - 你可以很容易地完成它:

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

了解这不是通常的情况很重要。还有其他的附件(比如如果你省略回调就让函数返回一个承诺),但一般来说它们并不是非常可靠。