在node.js中正确放置具有多个asynchronousredis调用的callback

我正在用node.js和redis构build作业队列系统,并试图找出如何最好地将callback实现到这个函数中。

在代码中,我只有cb()调用了3次,这是为了强调我正在讨论的redis调用。

显然,我可以嵌套三个调用(rpush – > sadd – > sadd),但是由于它们不相互依赖,那么这种做法会打败asynchronous处理的目的,不是吗?

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,我仍然在围绕它的一些function包装我的大脑。

为了让hmset,rpush和sadd函数知道他们推送的是哪个ID,他们必须在incr调用的callback中,但是在那之后,我不确定构build代码的最佳方式是。 任何帮助将是apreciated!

我认为最简单的就是使用一个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); });