当前位置: 首页 > 面试题库 >

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

周峻
2023-03-14
问题内容

请问有关节点和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

挠头 谢谢您的任何建议。


问题答案:

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

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

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

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

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

... // process results

但这似乎很混乱。

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

其他方式是:

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


 类似资料:
  • 按钮 开关 滑块 指示灯 标签 折线图 数字输入 文本输入

  • 虽然剧透可耻,但是为了体现Go语言的设计简洁之处,必须要先剧透一下。 Go语言的控制结构关键字只有 if..else if..else,for 和 switch。 而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定。看下下面的例子。 请比较一下A程序和B程序的不同之处。 A程序 package main import ( "fmt" ) func main() { f

  • 我目前正在学习MEAN堆栈,开发一个简单的TODO应用程序,并希望为此实现基于角色的访问控制(RBAC)。我怎么设置角色 我想要3个角色(角色可能看起来很有趣,但这纯粹是为了学习): 上帝 超级英雄 人 GOD-类似于超级管理员,可以在应用程序中做任何事情。C, R, U, D权限适用于TODO和其他用户。可以创建一个TODO 超级英雄——类似于管理员,有超能力在他的个人数据上做任何事情——对于T

  • 节流限速 (throttling) 允许你限制客户端给定时间的访问次数。限制和过期时间是在限速器里定义的。 默认有两个限速器,验证通过限速器和未验证限速器。 改变节流限速的 key 默认节流限速是绑定客户 ip 地址的。如果需要改变这个默认行为,你可以注册你自己的解决者,它应该返回一个字符串用于节流限速器。 app('Dingo\Api\Http\RateLimit\Handler')->setR

  • 对于Corda节点,控制器节点作为网络地图并提供验证公证服务。如果控制器节点关闭了怎么办?其他节点会独立运行吗?

  • 问题内容: 我使用Node / Express创建了一个小型API,并尝试使用Angularjs提取数据,但是由于我的html页面在localhost:8888上的apache下运行,而node API在端口3000上进行侦听,我得到了否’Access-Control-允许原产’。我尝试使用 和Vhosts Apache,但没有成功,请在下面查看完整的错误和代码。 XMLHttpRequest无法