Node.js redis hget在代码段中返回null,但在redis cli中工作 for(i=0;i

Node.js redis hget在代码段中返回null,但在redis cli中工作 for(i=0;i,node.js,redis,node-redis,Node.js,Redis,Node Redis,上面是我的代码片段。redis cli hget命令返回正确的答案,确认哈希设置正确,键和字段/值正确。但是,上面的代码片段为hget返回“null”(convID具有正确的值,该值是hget的字段)-我不明白为什么-convID在redisclient.lindex回调返回之前不会被设置。在for循环长期退出之前不会发生这种情况(因为节点的事件循环在退出循环之前都不会运行)。您正在向redisclient发出一大堆异步请求,而不是等待它们中的任何一个返回 对我来说,确切地告诉您想要做什么有点困

上面是我的代码片段。redis cli hget命令返回正确的答案,确认哈希设置正确,键和字段/值正确。但是,上面的代码片段为hget返回“null”(convID具有正确的值,该值是hget的字段)-我不明白为什么-

convID
redisclient.lindex
回调返回之前不会被设置。在
for
循环长期退出之前不会发生这种情况(因为节点的事件循环在退出循环之前都不会运行)。您正在向
redisclient
发出一大堆异步请求,而不是等待它们中的任何一个返回

对我来说,确切地告诉您想要做什么有点困难,但您可能希望了解控制库的流,比如异步


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

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

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

您应该将依赖于convID的所有代码放在lindex的回调中,并且在处理完所有结果之后,您可能需要在最后调用一个额外的回调


请参见

上的一个示例,感谢您的回复,它起到了作用,我现在更明白了,非常感谢。
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);

            });