节点/redis 和回调的控制流问题?

2023-12-26

请问我可以就节点和 Redis 的控制流问题寻求一些建议吗? (又名 Python 编码员试图习惯 JavaScript)

我不明白为什么client.smembers and client.get(Redis 查找)需要是回调而不是简单的语句 - 这让生活变得非常复杂。

基本上我想查询一个集合,然后当我得到该集合的结果时,我需要对每个结果进行获取。当我获得所有数据后,我需要将其广播回客户端。

目前,我使用全局对象在两个回调中执行此操作,这看起来很混乱。我什至不确定它是否安全(代码会等待一个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?

抓伤头预先感谢您的任何建议。


我不明白为什么client.smembers and client.get(Redis 查找)需要是回调而不是简单的语句 - 这让生活变得非常复杂。

这就是 Node。 (我很确定这个话题在这里讨论了足够多次,看看其他问题,它肯定存在)

我如何确定在调用之前已执行所有查找socket.broadcast?

这就是什么errfor 在回调函数中。这是 Node 的标准 - 回调中的第一个参数是错误对象(null如果一切顺利的话)。因此,只需使用类似的内容即可确保没有发生错误:

if (err) {
  ...    // handle errors.
  return // or not, it depends.
}

... // process results

但这看起来很混乱。

你会习惯的。当代码格式良好并且项目结构巧妙时,我实际上发现它很好。

其他方式有:

  • 使用库来控制异步代码流(Async.js https://github.com/caolan/async, Step.js https://github.com/creationix/step, etc.)
  • 如果您认为意大利面条式代码是混乱的,请定义一些函数来处理结果并将它们作为参数而不是匿名参数传递。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

节点/redis 和回调的控制流问题? 的相关文章

随机推荐