javascript - 使用 Node.js util 模块承诺所有方法
问题描述
我有一个 redis util,它看起来像:
const redis = require('redis')
const { promisify } = require('util')
const client = redis.createClient({
host: '127.0.0.1',
port: '6379'
})
module.exports = {
get: promisify(client.get).bind(client),
hget: promisify(client.hget).bind(client),
set: promisify(client.set).bind(client),
mset: promisify(client.mset).bind(client),
hset: promisify(client.hset).bind(client),
hmset: promisify(client.hmset).bind(client),
...
}
我想在不重复的情况下重写它。如何通过promisify
迭代每种方法导出客户端函数?
最初,我研究Object.keys(client)
并Object.getOwnPropertyNames(client)
作为获取要映射的方法名称的起点,但这些数组都不包含它们。
编辑:这更接近,有没有更好的表达方式?
const promisifiedClient = {}
for (const fn in Object.getPrototypeOf(client)) {
if (typeof client[fn] === 'function') {
promisifiedClient[fn] = promisify(client[fn]).bind(client)
}
}
module.exports = promisifiedClient
Edit2:也许这行得通(如果不是没有一些我可能不需要/想要承诺的承诺功能的奇怪副作用?)
const redisFunctionList = Object.keys(Object.getPrototypeOf(client))
const promisifiedRedis = redisFunctionList.reduce((acc, functionName) => {
acc[functionName] = promisify(client[functionName]).bind(client)
return acc
}, {})
module.exports = promisifiedRedis
解决方案
您可以使用bluebird包,然后可以简单地承诺 redis 客户端。
const redis = require("redis");
const bluebird = require("bluebird");
const client = new redis.RedisClient();
/// promise based client of redis
/// storing it in a variable helps with intellisense
const promiseClient = bluebird.promisifyAll(client);
const main = async () => {
/// After that, we just call the default methods with an Async in the end
/// For Example:
/// client.get becomes client.getAsync
/// client.set becaomes client.setAsync
const data = await promiseClient.getAsync("foo");
console.log(data);
const message = await promiseClient.quitAsync();
console.log(message);
};
main();
module.exports = promiseClient;
推荐阅读
- service-worker - 何时以及如何在 service worker 中触发同步事件?
- android - canvas.drawPath() 不是实时绘图
- javascript - ES6 对窗口调整大小和窗口就绪的执行方法
- google-bigquery - 与 BigQuery 表输入大小相比,为什么我的 PCollection (SCollection) 大小如此之大?
- java - Spark scala为列添加权重和运行计算
- r - 如何在观星者输出中省略开始表
- actions-on-google - 在收到成功的操作响应后,Google 助理现在会间歇性地永远挂起
- python - pygame不画线
- sql - 是否有任何 Eloquent 方法来获取关系表的总和并按其排序?
- java - 从 Java 中的 BufferedReader 中过滤文本