2012-06-10 321 views
0
for (i=0 ; i < pri.state.totalConversations; i++) { 
      redisclient.lindex("conversationsIDList",i, function(err,reply) { 
      convID = reply; 
      console.log("ConvID: " + "i: " + i + " "+ convID);   
}); 
      if(convID == pri.state.lastUpdatedConversationID) 
      break; 
      redisclient.hget("conversations", convID, function(err,reply) { 
      console.log("ConvID hget: "+ convID + " "+ reply); 
       data = JSON.parse(reply); 
       console.log("data: " +data); 

      }); 

上面是我的代码片段。 redis-cli hget命令返回正确的答案,确认我使用正确的键和字段/值正确设置了散列值。然而,上面的代码片段为hget返回“null”,(convID具有正确的值,这是hget的字段) - 我不明白为什么 -redis hget在代码片段中返回null,但在redis-cli中工作

+0

感谢您的答复为例,它的工作和我最好现在明白了,感激不尽。 – user1447121

回答

1

convID将不会被设置,直到您的redisclient.lindex回调返回。直到你的for循环已经退出为止,这是不会发生的(因为在你退出循环之前,节点的事件循环甚至不会运行)。您正在向redisclient发出大量异步请求,而不是等待其中任何人返回。

对于我来说确切地说出你想要做什么有点困难,但是你可能想看看像Async这样的流程控制库。

可能可以定义一个布尔标志变量(作用域为您的模块或任何函数启动您的循环),它将由您的第一次成功回调设置,并会告知后续回调忽略它们的结果。但我只是猜测。主要问题是您正试图在异步环境中使用同步控制流。

+0

谢谢,这有帮助。我也想为这个答案投票。 – user1447121

1

问题不在于Redis,而在于您对node.js异步编程的理解。 Redis客户端库是异步的(像大多数node.js库)。你不能像使用同步一样使用它。

在Redis有机会发送lindex命令的结果之前发送hget命令。在您期望的时间,convID变量未设置为您所期望的。在任何结果可以被处理之前,for循环退出。

你应该把所有的代码都依赖于convID在lindex的回调中,并且当所有的结果都被处理完后你可能需要额外的回调来调用。

看到For loop get items from redis delay

相关问题