gpt4 book ai didi

javascript - 使用 node_redis 的 Node.js 回调

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

我仍在努力学习 node.js,可能有些地方不太对劲。我期待完成的是首先查询包含房间列表的 hmap。将迭代此列表以获取每个房间的更多详细信息,例如房间名称等。

这是查询应该返回的内容:

redis 127.0.0.1:6379> lrange rooms 0 -1
1) "room:5000"

redis 127.0.0.1:6379> hgetall room:5000
1) "name"
2) "room1"
3) "admin"
4) "user:1001"
5) "public"
6) "true"

这是我在 routes.index 中的函数

exports.index = function(req, res){

var render_rooms = new Array();

req.app.settings.redis.lrange('rooms',0,-1, function(error, rooms) {

if (error) {
console.log('Error: '+ error);
}
else {

rooms.forEach(function(room){
console.log("room: " + room);

req.app.settings.redis.hgetall(room, function(error, roomdetails){
if (error) {
console.log('Error: '+ error);
}
else {
console.log("roomdetails: " + roomdetails.public);

if(roomdetails.public == "true"){
render_rooms.push(roomdetails.name);

}

}
});

});




// console.log('Name: ' + result);
// res.render('account', { title: 'account title', user: req.user.username, votes: result });
}

});


console.log("length: " + render_rooms.length);
res.render('index', { title: 'Index', username: req.user.username, rooms: render_rooms });

};

我不确定我是否正确使用了 node_redis 来实现这一点。此外,我想出了将所有房间详细信息存储在一个数组中的想法,我期待将其发送到 View 。显然,列表总是不显示任何元素,因为我想在列表被填充之前被调用,因为我缺少一些基本的回调功能。但是我无法解决它。有人可以更详细地向我解释它“应该”如何工作吗?

最佳答案

您的基本问题是您需要等待渲染 render_rooms 数组,直到所有异步处理完成。按照现在的编写方式,res.render 在任何异步 Redis 查询完成之前被调用。

像这样:

exports.index = function(req, res){

var render_rooms = new Array();

req.app.settings.redis.lrange('rooms',0,-1, function(error, rooms) {

// Keep track of the number of rooms we have left to process.
var roomcount = rooms.length;

if (error) {
console.log('Error: '+ error);
}
else {

rooms.forEach(function(room){
console.log("room: " + room);

req.app.settings.redis.hgetall(room, function(error, roomdetails){
if (error) {
console.log('Error: '+ error);
}
else {
console.log("roomdetails: " + roomdetails.public);

if(roomdetails.public == "true"){
render_rooms.push(roomdetails.name);
}

// Render code moves to here and is only run after all rooms
// have been processed.
if (--roomcount === 0) {
console.log("length: " + render_rooms.length);
res.render('index', {
title: 'Index',
username: req.user.username,
rooms: render_rooms
});
}
}
});
});
}
});
};

一旦您对它的作用感到满意,就可以使用 async.forEach 稍微清理一下它。或 async.forEachSeries更清晰地支持这种类型的流程。

关于javascript - 使用 node_redis 的 Node.js 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13459798/

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