javascript - 使用 Promise.all 时,Node_Redis HGET 解析为 bool 数组

标签 javascript node.js redis promise node-redis

我一直在深入研究 Redis 并开发一个使用 Redis 的小型 Web 应用程序,因为它只是数据存储(我知道这不是 Redis 的预期目的,但我受益于学习命令以及在 Node 上整体使用 Redis . 我正在使用 Node_Redis。

这是我想要完成的(全部在 redis 中): 我正在尝试使用他们的电子邮件检索用户。

问题是: 我有一个 Promise.all 调用,它接受所有电子邮件( key )并将每个映射到一个 HGET 命令。当 Promise.all 解析时,我希望它解析为一组用户对象,但它最终解析为一组 bool 值(即 [true, true, true])。

这是/users的逻辑

router.get("/", (req, res) => {
  client.lrange("emails", 0, 1, (err, reply) => {
    if (err) return console.log(err);
    if (reply) {
      Promise.all(
        reply.map(email => {
          return client.hgetall(email, (err, reply) => {
            if (err) return console.log(err);
            console.log("reply for hgetall", reply); // this prints a user object correct, but Promise.all still resolves to boolean array :(
            return reply;
          });
        })
      )
        .then(replies => {
          // replies = [true, true, true ...]
          res.send(replies);
        })
        .catch(e => console.log(e));
    } else {
      res.send([reply, "reply is null"]);
    }
  });
});

我实际上已经多次使用 Promise.all,当我记录来自 redis 的回复时,它也显示了正确的对象,所以我现在很困惑。如何让 Promise.all 解析为一组用户对象?

最佳答案

问题是 client.hgetall 没有返回 promise 。它是异步函数,您传递回调以获得结果。您应该 promise 此函数以在Promise.all 中使用它:

...
return new Promise((resolve, reject) => {
  client.hgetall(email, (err, reply) => {
    if (err) {
      return reject(err);
    }
    resolve(reply);
  });
});

您可以手动promisification(如上例所示),也可以使用BluebirdQ 库及其promisifypromisifyAll 方法。

关于javascript - 使用 Promise.all 时,Node_Redis HGET 解析为 bool 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041876/

相关文章:

javascript - WebRTC 重新协商对等连接以切换流

Redis.windows.conf 与 Redis.windows-service.conf

javascript - 在预期返回 void 的函数参数中返回 Promise

javascript - jquery hover() 不触发

node.js - 试图让我自己的 RxJs 可观察

javascript - Express.js 和 Bluebird - 处理 promise 链

javascript - angular watchers 和 event listeners 以什么顺序执行?

javascript - 单击取消按钮时无法停止执行

运行 doRedis- 即使已导出对象也未找到

typescript - 如何使用 `ioredis`中的Redis设置RedisService?