小编典典

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

redis

请问有关节点和Redis的控制流问题的一些建议吗?(又名试图习惯JavaScript的Python编码器)

我不明白为什么client.smembersclient.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

挠头 谢谢您的任何建议。


阅读 221

收藏
2020-06-20

共1个答案

小编典典

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

那就是Node。(我很确定在这里讨论这个话题的次数已经足够多了,通过其他问题,肯定存在)

如何确定在致电之前已执行所有查找socket.broadcast

这就是err回调函数的目的。这是Node的标准-
回调中的第一个参数是错误对象(null如果一切正常)。因此,请使用类似以下内容的内容以确保没有发生错误:

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

... // process results

但这似乎很混乱。

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

其他方式是:

  • 使用库来控制异步代码流(Async.jsStep.js等)
  • 如果您认为意大利面条式代码是一团糟,请定义一些函数来处理结果并将其作为参数而不是匿名参数传递。
2020-06-20