Node.jscallback与node_redis

我仍然试图进入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来实现这一点。 此外,我想出了一个想法,把所有的房间细节存储在一个数组中,我期待着把它发送到视图中。 显然,列表总是不显示任何元素,因为我想在列表被填充之前调用,因为我缺less一些基本的callback函数。 但是我无法摆弄它。有人能更详细地解释我应该怎么做吗?

你的基本问题是你需要等待呈现render_rooms数组,直到所有的asynchronous处理完成。 现在编写的方式是在任何asynchronousRedis查询完成之前调用res.render

像这样的东西:

 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来清理它,这些工具更加干净地支持这种types的stream。