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
答案 0 :(得分:7)
问题在于,如果它遍历原型并放置*Async
函数 - 您将需要原型链中每个对象的全新副本,这可能会因为库返回自己的对象而失败。
那就是 - 如果您正在使用Mongoose并且您正在获取一个集合对象 - 图书馆不知道会返回已宣传的版本 - 您拥有自己的版本的副本但是图书馆不会很好玩。此外,库也调用自己的函数,更改签名会破坏大量内部代码。
当然,如果您只需要一个级别和,那么您不必关心原型和,而您并不关心内部调用 - 你可以很容易地完成它:
Object.getOwnPropertyNames(object).forEach(function(key){
object[key] = Promise.promisify(object[key]);
});
了解这不是通常的情况很重要。还有其他的附件(比如如果你省略回调就让函数返回一个承诺),但一般来说它们并不是非常可靠。