[英]Proper placement of callback with multiple async redis calls in node.js
我正在使用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);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.