gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:09:36 24 4
gpt4 key购买 nike

我一直在深入研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com