jjzjj

javascript - 正确嵌套 Redis 回调

coder 2023-07-19 原文

我正在编写一个 node.js 程序,它接收 snmp 陷阱并将它们存储在 redis 哈希数据库中。我用 Node.js 编程的时间不长,我认为我不完全理解我的代码是如何执行的。

我觉得我的一些 redis 调用比其他调用先完成,这就是为什么我尝试将所有内容嵌套在它们的回调函数中,但我担心我没有以正确的方式执行此操作。

我的输出看起来已经接近我想要实现的目标,但是会弹出一些随机问题,例如我收到的第一个陷阱的第 # 代为 1,然后下一次为 11 或 111。我所做的只是对整数执行 redis client.incr 函数。

简而言之,我使用两个散列键来跟踪我收到的当前和过去的陷阱。我将两个数字的生成和散列数作为单独的整数键值进行跟踪,并根据需要递增它们。这两个数字用于在当前和过去的陷阱哈希中创建和访问值。

这是我的代码。

function alarmCheck (key, field, value, alarmType, ipAddress) {
var historyKey = "History:"+key;
//var generationNumber;
//var numberInHash;

client.get(ipAddress+":"+field+":Gen", function (err, rep) {
    //generationNumber = rep;
    var generationNumber = rep;
    console.log("The Gen: "+rep);
    client.get(ipAddress+":"+field+":Field", function (err, reply) {

        var numberInHash = reply;
        //numberInHash = reply;
        console.log("The Field: "+reply);

        console.log("ALARM TYPE: "+alarmType);
        if(alarmType == 1) //Alarm Start value is 1
        {
            fullCurrKey = "Current:" + key;
            fullField = field + ":" + generationNumber + ":" + numberInHash;
            console.log("The FULL Field: "+fullField);
            client.hsetnx(fullCurrKey, fullField, value, function (err, status) {
                if(status == 1)
                {
                    console.log("ADDED to Current!");
                    client.incr(ipAddress+":"+field+":Field", redis.print);
                }
            })
    } else //If Alarm Start value is 0 or 2 
        {
            fullCurrKey = "Current:" + key;
            fullHistKey = "History:" + key;
            console.log("Loop generationNumber: "+generationNumber);
            console.log("Loop numberInHash: "+numberInHash);
            loop1:
            for(var i=1;i<=generationNumber;i++)
            {
                loop2:
                for(var j=1;j<=numberInHash;j++)
                {
                    fullField = field + ":" + i + ":" + j;
                    console.log("Alarm 0 or 2 fullField: "+fullField);
                    client.hget(fullCurrKey, fullField, function (err, reply) {
                        var theField = fullField;
                        if(reply == null)
                        {
                            console.log("Null hget!");
                        }
                        else
                        {
                            console.log("Adding to history!");
                            console.log("The loop hget reply: "+reply);
                            console.log("The loop hget fullField: "+fullField);
                            console.log("The loop hget theField: "+theField);
                            client.hset(fullHistKey, theField, reply, redis.print);
                            //break loop1;
                        }
                    });
                }
            }
            client.set(ipAddress+":"+field+":Field", 1, function (err, reply) {
                client.incr(ipAddress+":"+field+":Gen", function (err, reply) {
                    client.hset(fullHistKey, field+":"+generationNumber+":"+(numberInHash+1), value, function (err, reply) {
                        if (err)
                        {
                            console.log("Fail :( "+err);
                        }
                    });
                }); 
            });
                    }
    });
});
}

这是我当前的一些输出。

1) "Composite Gamut Error:1:1"
2) "Composite Gamut Error( -c ) 1345493146"
3) "Luma Gamut Error:1:1"
4) "Luma Gamut Error( -l ) 1345493146"
5) "Jitter1 Level:1:1"
6) "Jitter1 Level 1345493146"
7) "RGB Gamut Error:1:1"
8) "RGB Gamut Error( Rr-gBb ) 1345493146"
9) "Composite Gamut Error:1:2"
10) "Composite Gamut Error( Cc ) 1345493147"
11) "Luma Gamut Error:1:2"
12) "Luma Gamut Error( Ll ) 1345493147"
13) "RGB Gamut Error:1:2"
14) "RGB Gamut Error( R--gBb ) 1345493147"
15) "SDI Input Signal Lock:1:1"
16) "SDI Input Signal Lock( Unlocked ) 1345493147"
17) "Y Anc Checksum Error:3:1"
18) "Y Anc Checksum Error( Error ) 1345493147"
19) "SDI Input Signal Lock:2:1"
20) "SDI Input Signal Lock( Unlocked ) 1345493147"
21) "Line Length Error:4:1"
22) "Line Length Error( Error ) 1345493147"
23) "SAV Place Error:4:1"
24) "SAV Place Error( Error ) 1345493147"
25) "AP CRC Error:3:1"
26) "AP CRC Error( Invalid ) 1345493147"
27) "FF CRC Error:3:1"
28) "FF CRC Error( Invalid ) 1345493147"
29) "EDH Error:3:1"
30) "EDH Error( Invalid ) 1345493147"

这是我的一些历史输出。

1) "Line Length Error:1:11"
2) "Line Length Error( Error ) 1345493147"
3) "EAV Place Error:1:11"
4) "EAV Place Error( Error ) 1345493147"
5) "SAV Place Error:1:11"
6) "SAV Place Error( Error ) 1345493147"
7) "Composite Gamut Error:1:3"
8) "Composite Gamut Error( Cc ) 1345493147"
9) "Composite Gamut Error:1:31"
10) "Composite Gamut Error 1345493147"
11) "Luma Gamut Error:1:3"
12) "Luma Gamut Error( Ll ) 1345493147"
13) "Luma Gamut Error:1:31"
14) "Luma Gamut Error 1345493147"
15) "Y Anc Checksum Error:1:11"
16) "Y Anc Checksum Error( Error ) 1345493147"
17) "RGB Gamut Error:1:3"
18) "RGB Gamut Error( R--gBb ) 1345493147"
19) "RGB Gamut Error:1:31"
20) "RGB Gamut Error 1345493147"
21) "Y Anc Checksum Error:2:11"
22) "Y Anc Checksum Error( Error ) 1345493147"
23) "Line Length Error:2:11"
24) "Line Length Error( Error ) 1345493147"
25) "Field Length Error:1:11"
26) "Field Length Error( Error ) 1345493147"
27) "SAV Place Error:2:11"
28) "SAV Place Error( Error ) 1345493147"
29) "AP CRC Error:1:11"
30) "AP CRC Error( Invalid ) 1345493147"
31) "FF CRC Error:1:11"
32) "FF CRC Error( Invalid ) 1345493147"
33) "EDH Error:1:11"
34) "EDH Error( Invalid ) 1345493147"

最佳答案

我强烈推荐 async waterfall为了这。它将为您的代码带来更多结构和控制,并减少嵌套回调。

async.waterfall([
  function(callback){
    redis.get('abc', function(error, result) {
      callback(error, result);
    });
  },
  function(firstResult, callback){
    redis.set('abc', firstResult, function(error, result) {
      callback(error, result);
    });
  }
], function (err, result) {
   // do something to finish operations
});

关于javascript - 正确嵌套 Redis 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045614/

有关javascript - 正确嵌套 Redis 回调的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  5. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  6. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  9. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  10. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

随机推荐