Обещать все методы с помощью утилитного модуля Node.js - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть утилита redis, которая выглядит следующим образом:

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

Редактировать2: Возможно, это работает (если это не без какого-то странного побочного эффектаобещающие функции, которые мне могут не понадобиться / не хотите обещать?)

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...