gpt4 book ai didi

javascript - Bluebird PromisifyAll 没有任何 Async 后缀,即可以替换原始功能吗?

转载 作者:数据小太阳 更新时间:2023-10-29 04:13:32 24 4
gpt4 key购买 nike

Bluebird有一个promisifyAll函数“通过遍历对象的属性并在对象及其原型(prototype)链上创建每个函数的异步等价物来 Promisify 整个对象。”

它创建带有后缀 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

最佳答案

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

也就是说 - 如果您正在使用 Mongoose 并且您正在获取一个集合对象 - 库将不知道返回 promise 版本 - 您将拥有自己的 promise 版本副本但库不会播放很好用。此外,库也会调用自己的函数,更改它们的签名会破坏很多内部代码。

当然,如果您只需要一层深度并且您不关心原型(prototype)并且您不关心内部调用 - 您可以轻松地完成它:

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

重要的是要了解这不是通常的情况。还有其他方法(比如如果您省略回调,则让函数返回一个 promise )但通常它们不是很可靠。

关于javascript - Bluebird PromisifyAll 没有任何 Async 后缀,即可以替换原始功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30601258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com