在node.js中正确放置具有多个异步redis调用的回调

内森

我正在使用node.js和redis构建作业队列系统,并试图找出如何最好地将回调实现到此函数中。

在代码中,我只是为了强调我所谈论的redis调用而将cb()调用了3次。

显然,我可以嵌套三个调用(rpush-> sadd-> sadd),但是鉴于它们不相互依赖,这会破坏异步处理的目的,不是吗?

Queue.prototype.pushJob = function(job, cb) {
    var that = this;
    cb = cb || function(err, res) {};
    if (job.name) {
        that.Database.incr("id:jobs", function(id) { //Increment redis variable id:jobs
            that.Database.client.hmset('job:' + id, { //Callback of incr, set the hash of job:incr
                "name": job.name,
                "status": job.status,
                "payload": job.payload,
                "priority": job.priority
            }, function() { //Callback of hmset, add incr to jobs list
                that.Database.client.rpush('jobs', id, function(err, res) { //Add id to jobs array
                    cb(err, res); //Callback
                });

                that.Database.client.sadd('jobs.status.' + job.status, id, function(err, res) { //Add status to type array
                    cb(err, res); //Callback
                });

                that.Database.client.sadd('jobs.name.' + job.name, id, function(err, res) { //Add status to type array
                    cb(err, res); //Callback
                });
            });
        });
        return true;
    }
    console.log("Invalid data passed to Job");
    cb(null);
    return false;
};

真正的原因是这是我第一次使用redis,并且仍在努力使我的大脑围绕其某些功能。

为了让hmset,rpush和sadd函数知道它们要推送到哪个ID,它们必须位于incr调用的回调中,但是在那之后,我不确定构造代码的最佳方法是。任何帮助将不胜感激!

罗伯特克莱普

我认为最简单的方法是使用一个Multi对象:

that.Database.incr("id:jobs", function(id) { 
  var multi = that.Database.client.multi();
  multi.hmset('job:' + id, { ... });
  multi.rpush('jobs', id);
  multi.sadd('jobs.status.' + job.status, id);
  multi.sadd('jobs.name.' + job.name, id);
  multi.exec(cb);
  // or a bit less explicit:
  //
  // that.Database.client.multi()
  //                     .hmset('job:' + id, { ... })
  //                     .rpush('jobs', id)
  //                     .sadd('jobs.status.' + job.status, id)
  //                     .sadd('jobs.name.' + job.name, id)
  //                     .exec(cb);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在node.js中正确放置具有多个异步redis调用的回调

来自分类Dev

API调用的异步并行与node.js中的回调

来自分类Dev

具有嵌套回调格式的Node.js连续方法调用

来自分类Dev

具有一个响应的多个回调-Node JS

来自分类Dev

异步回调Node.js

来自分类Dev

Node JS Mongoose 异步回调

来自分类Dev

正确的过程以在Node.js中调用多个异步函数

来自分类Dev

正确的过程以在node.js中调用多个异步函数

来自分类Dev

Node.js回调:返回所有回调后,调用grand_callback

来自分类Dev

Node.js /使Redis异步调用

来自分类Dev

node.js redis 异步调用

来自分类Dev

在Node.js(异步)中的循环和回调中寻找正确的模式

来自分类Dev

带有异步瀑布/ Node.js的未定义“回调”

来自分类Dev

在Node.js中制作异步回调函数

来自分类Dev

Node.js承诺,异步或仅回调

来自分类Dev

Node.js,回调,异步,命令行

来自分类Dev

Node.JS函数返回异步回调函数的值

来自分类Dev

如何在Koa中正确使用Redis(node.js)

来自分类Dev

Node.js for带有回调的循环,之后具有同步执行

来自分类Dev

node.js回调的正确控制流程是什么?

来自分类Dev

在所有迭代完成之前调用了node.js async.each()回调

来自分类Dev

Node.js-错误回调的重新调用功能-是否有非阻塞方式?

来自分类Dev

“调用堆栈”用于node.js中的回调

来自分类Dev

在Node.js回调中调用模块函数

来自分类Dev

“调用堆栈”用于node.js中的回调

来自分类Dev

等待Node.js中的多个回调

来自分类Dev

多个Node.js回调存在问题

来自分类Dev

Node.js中的多个mysql查询和回调

来自分类Dev

整合node.js模块导出中的多个回调

Related 相关文章

热门标签

归档