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

lag*_*lex 8 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`
Run Code Online (Sandbox Code Playgroud)

可以选择指定自定义后缀选项,但遗憾的是它不适用于空字符串

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

RangeError: suffix must be a valid identifier
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 7

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

也就是说 - 如果你正在使用Mongoose并且你正在获得一个集合对象 - 库将不知道返回promisified版本 - 你有自己的promisified版本副本但是库不会很好用它.此外,库也调用自己的函数,更改其签名会破坏大量内部代码.

当然,如果您只需要一个级别而且您不关心原型并且您不关心内部调用 - 您可以轻松地完成它:

Object.getOwnPropertyNames(object).forEach(function(key){
    object[key] = Promise.promisify(object[key]);
});
Run Code Online (Sandbox Code Playgroud)

重要的是要理解这不是通常的情况.还有其他apporoaches(如果你省略回调,就像让函数返回一个promise),但总的来说它们不是很可靠.