Bluebird PromisifyAll 没有任何 Async 后缀,即可以替换原始功能吗?
Bluebird PromisifyAll without any Async suffix, i.e. replace the original functions possible?
Bluebird has a promisifyAll函数即"Promisifies the entire object by going through the object's properties and creating an async equivalent of each function on the object and its prototype chain."
它创建带有后缀 Async
的函数。
是否可以完全替换旧功能?替换的函数就像原始函数一样工作,此外它们还 return 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
问题是,如果它遍历原型并放置 *Async
函数 - 您将需要原型链中每个对象的全新副本,这可能会失败,因为库 return 它们自己的对象.
也就是说 - 如果您正在使用 Mongoose 并且您正在获取一个集合对象 - 库将不知道 return promisified 版本 - 您将拥有自己的 promisified 版本副本但是图书馆不会很好地使用它。此外,库也会调用自己的函数,更改它们的签名会破坏很多内部代码。
当然,如果你只需要一层深度 and 你不关心原型 and 你不关心关心内部调用 - 你可以轻松完成它:
Object.getOwnPropertyNames(object).forEach(function(key){
object[key] = Promise.promisify(object[key]);
});
重要的是要了解这不是通常的情况。还有其他方法(比如如果您省略回调,则使函数 return 成为一个承诺)但通常它们不是很可靠。
Bluebird has a promisifyAll函数即"Promisifies the entire object by going through the object's properties and creating an async equivalent of each function on the object and its prototype chain."
它创建带有后缀 Async
的函数。
是否可以完全替换旧功能?替换的函数就像原始函数一样工作,此外它们还 return 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
问题是,如果它遍历原型并放置 *Async
函数 - 您将需要原型链中每个对象的全新副本,这可能会失败,因为库 return 它们自己的对象.
也就是说 - 如果您正在使用 Mongoose 并且您正在获取一个集合对象 - 库将不知道 return promisified 版本 - 您将拥有自己的 promisified 版本副本但是图书馆不会很好地使用它。此外,库也会调用自己的函数,更改它们的签名会破坏很多内部代码。
当然,如果你只需要一层深度 and 你不关心原型 and 你不关心关心内部调用 - 你可以轻松完成它:
Object.getOwnPropertyNames(object).forEach(function(key){
object[key] = Promise.promisify(object[key]);
});
重要的是要了解这不是通常的情况。还有其他方法(比如如果您省略回调,则使函数 return 成为一个承诺)但通常它们不是很可靠。