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 的字段)-我不明白为什么-

4

2 回答 2

1

convIDredisclient.lindex在您的回调返回之前不会设置。for在您的循环早已退出之前,这不会发生(因为节点的事件循环甚至在您退出循环之前都不会运行)。您正在触发一大堆异步请求,redisclient而不是等待它们中的任何一个返回。

我很难确切地说出你想要做什么,但你可能想研究像 Async 这样的流控制库。

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

于 2012-06-10T10:16:28.563 回答
1

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

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

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

请参阅For 循环从 redis 延迟获取项目的示例

于 2012-06-10T10:24:09.970 回答