蓝鸟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
问题是,如果它走的原型和地方*Async
function – 您将需要原型链中的每个对象的全新副本,这可能会失败,因为库返回自己的对象。
也就是说,如果你使用的是Mongoose,而且你得到了一个集合对象 – 库不知道要返回promisified的版本 – 你有自己的promisified版本的副本,但是库不会很好。 另外,库也调用它自己的函数,改变他们的签名会破坏很多内部代码。
当然,如果你只需要一个层次,你不需要关心原型, 而且你不关心内部调用 – 你可以很容易的完成它:
Object.getOwnPropertyNames(object).forEach(function(key){ object[key] = Promise.promisify(object[key]); });
理解这一点很重要,但这不是通常的情况。 还有其他的应用(比如,如果你忽略了callback,使得函数返回一个promise),但是通常它们不是很可靠。