2013-06-04 21 views
0

说我的服务器正在准备一个新的对象响应发送到POST请求的处理:异步node_redis功能,尴尬的两个键使用INCR一次

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... 
} 

我觉得我失去了一些东西很明显,作为一个新手节点.js和redis编程器...

回答

1

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

+0

啊,是的,我并不理解multi/exec模式是如何工作的......我假定exec()被调用的“结果”参数就像调用incr()的返回值一样,单独(即成功或失败为真/假)。谢谢。 – strugglingcomic