使用util.promisify模拟bluebird.promisifyAll

时间:2017-08-08 10:49:01

标签: node.js typescript redis promise bluebird

我试图以类似于Bluebird' {{1}的方式使用节点8 RedisClient宣传整个node_redis util.promisify对象。工作,没有太多运气。

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

promisifyAll()

然而,这有效:

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);

有什么想法吗?

编辑:我想要使用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), }; 而不是像Bluebird这样的主要原因是因为我在TypeScript和Bluebird&#39中都这样做; util.promisify似乎无法解决这个问题。

3 个答案:

答案 0 :(得分:0)

在寻找同一件事时,请跨过这一点。这是我目前正在使用的,并且似乎可以正常工作:

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'))
})

答案 1 :(得分:0)

我尝试了以下模块,它使用起来非常简单,可以用来替换bluebird promise。 link

https://www.npmjs.com/package/util-promisifyall

答案 2 :(得分:-1)

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

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

我知道您可能希望本地执行此操作,但是,考虑到您可以根据需要免费获取方法链接,并认为它是值得一提的。

免责声明 - 我是作者