使用 util.promisify 模拟 bluebird.promisifyAll

aen*_*rew 7 redis node.js promise typescript bluebird

我试图以类似于 Bluebird 的方式使用 Node 8 的方式来保证整个node_redis RedisClient对象util.promisifypromisifyAll()工作,但运气不佳。

这是我迄今为止尝试过的:

import * as _redis from 'redis';
import { promisify } from 'util';
const client = _redis.createClient();
const redis = Object.keys(client).reduce((c, key) => {
  if (typeof c[key] === 'function') c[key] = promisify(c[key]).bind(c);
  return c;
}, client);
Run Code Online (Sandbox Code Playgroud)

然而,这有效:

const redis = {
  get: promisify(client.get).bind(client),
  set: promisify(client.set).bind(client),
  hget: promisify(client.hget).bind(client),
  hmset: promisify(client.hmset).bind(client),
};
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:我想使用util.promisify而不是像 Bluebird 这样的东西的主要原因是因为我在 TypeScript 中做这一切,而 BluebirdpromisifyAll似乎不适用。

小智 5

当我在寻找同样的东西时遇到了这个。这是我目前正在使用的并且似乎有效:

const { promisify } = require('util')
const redis = require('redis')

const client = redis.createClient('redis://localhost:6379')

client.promise = Object.entries(redis.RedisClient.prototype)
  .filter(([_, value]) => typeof value === 'function')
  .reduce((acc, [key, value]) => ({
    ...acc,
    [key]: promisify(value).bind(client)
  }), {})

client.on('connect', async () => {
  await client.promise.set('foo', 'bar')

  console.log(await client.promise.get('foo'))
})
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 0

您可以使用Fluentify,它很小并且没有外部依赖项,并且几乎可以完成您的任务。我自己实际上已经将它用于 Redis,有一些小警告,但在你的情况下应该相当简单,例如

import * as _redis from 'redis';
import fluentify from 'fluentifyjs';
...
const client = fluentify(_redis.createClient());
const result = await client.get('key').done();
Run Code Online (Sandbox Code Playgroud)

我知道您可能希望在本地执行此操作,但是,考虑到您可以在需要时免费获得方法链接,因此认为作为替代方案值得一提。

免责声明 - 我是作者