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的字段) - 我不明白为什么 -
答案 0 :(得分:1)
convID
回调返回之前, redisclient.lindex
不会被设置。在你的for
循环早已退出之前就不会发生这种情况(因为节点的事件循环在你离开循环之前甚至不会运行)。你正在向redisclient
发出一大堆异步请求,而不是等待其中任何一个回来。
我很难确切地说出你想做什么,但是你可能想要研究像Async这样的控制流库。
可能可以定义一个布尔标志变量(作用于您的模块或任何启动循环的函数),该变量将由您的第一个成功回调设置,并告诉后续回调忽略其结果。但我只是在猜测。主要问题是您尝试在异步环境中使用同步控制流。
答案 1 :(得分:1)
问题不在于Redis,而在于您对node.js异步编程的理解。 Redis客户端库是异步的(与大多数node.js库一样)。你不能像使用同步一样使用它。
在Redis有机会发送lindex命令的结果之前发送hget命令。在您期望的时候,convID变量未设置为您期望的值。在可以处理任何结果之前退出for循环。
你应该在lindex的回调中根据convID放置所有代码,并且你可能需要一个额外的回调函数,以便在处理完所有结果时调用它。
上的示例