处理异步node_redis函数,一次使用两个键上的INCR很尴尬

时间:2013-06-04 06:35:44

标签: javascript node.js redis node-redis

假设我的服务器正准备发送一个新对象以响应POST请求:

var responseObj = {
    UserID : "0", // default value
    ItemID : "0", // default value
    SomeData : foo
}

现在,当我创建这个新对象时,我想增加我在redis中使用的UserIdItemID个计数器来跟踪这两个项目。但这似乎需要两个独立的异步回调,这对我来说似乎是一个问题,因为我不能只将其余的响应编写代码放入其中一个回调中。

我的意思是,如果我只有一个密钥和一个回调担心,我会写一些类似的东西:

app.post('/', function(req, res, next) {
    // do some pre-processing  

    var responseObj = {};      

    redis.incr('UserID', function(err, id) {
        responseObj.UserID = id;

        // do more work, write some response headers, etc.

        res.send(responseObj);
    });
}

但是我需要做两个INCR回调怎么办?我不认为这是对的,因为一切都是异步的,我不能保证我的回答会被正确设置......

app.post('/', function(req, res, next) {
    // do some pre-processing

    var responseObj = {};   

    redis.incr('UserID', function(err, id) {
        responseObj.UserID = id;
        // do some work
    });

    redis.incr('ItemID', function(err, id) {
        responseObj.ItemID = id;
        // do some work
    });

    res.send(responseObj); // This can't be right...
}

我觉得我错过了一些明显的东西,作为一个新手node.js和redis程序员......

1 个答案:

答案 0 :(得分:1)

您可以通过transactionlua script在一次通话中执行多个redis命令。这样你就不必处理每个命令的一个回调,而是执行多个命令并只处理一个回调。例如,尝试在redis客户端中查看multi方法/命令。