请问有关节点和Redis的控制流问题的一些建议吗?(又名试图习惯JavaScript的Python编码器)
我不明白为什么client.smembers和client.get(Redis查找)需要是回调,而不是简单地成为语句-这使生活变得非常复杂。
client.smembers
client.get
基本上,我想查询一个集合,然后在获得集合的结果时,需要对每个结果进行获取。 当我获得所有数据后 ,我需要将其广播回客户端。
目前,我在两个回调中使用一个全局对象执行此操作,这看起来很混乱。我什至不确定它是否安全(代码会client.get在启动另一个之前等待一个完成吗?)。
当前代码如下:
var all_users = []; // Get all the users for this page. client.smembers("page:" + current_page_id, function (err, user_ids ) { // Now get the name of each of those users. for (var i = 0; i < user_ids.length; i++) { client.get('user:' + user_ids[i] + ':name', function(err, name) { var myobj = {}; myobj[user_ids[i]] = name; all_users.push(myobj); // Broadcast when we have got to the end of the loop, // so all users have been added to the list - // is this the best way? It seems messy. if (i === (user_ids.length - 1)) { socket.broadcast('all_users', all_users); } }); } });
但这似乎很混乱。这真的是最好的方法吗?如何确定在致电之前已执行所有查找socket.broadcast?
socket.broadcast
挠头 谢谢您的任何建议。
那就是Node。(我很确定在这里讨论这个话题的次数已经足够多了,通过其他问题,肯定存在)
如何确定在致电之前已执行所有查找socket.broadcast?
这就是err回调函数的目的。这是Node的标准- 回调中的第一个参数是错误对象(null如果一切正常)。因此,请使用类似以下内容的内容以确保没有发生错误:
err
null
if (err) { ... // handle errors. return // or not, it depends. } ... // process results
但这似乎很混乱。
您会习惯的。当代码格式正确且项目结构巧妙时,我实际上发现它很好。
其他方式是: