使用node-redis获取多个键

3

我正在尝试从 Redis 实例中获取一组键。我正在使用 node-redis。我在使用循环:

for( var i=1; i<=num; ++i ){
    client.get(key + ':' + num, function (err, reply) {
        obj[num] = reply;
    });
}
return obj;

但是obj只是未定义的。我觉得可能出现问题的原因是get方法显然是异步调用的。有没有其他方法可以实现这个目标?或者我应该将这些值存储在排序集合中而不是对象中吗?


1
obj 声明在哪里? - Ian
1个回答

10

根据代码接口和您的评论,我猜测client.get()是异步的。这意味着它会在稍后的时间调用传递给它的回调函数,而不是立即调用。因此,您不能使用同步编码模式来收集对client.get()的多次调用结果,因为当函数返回时,obj中的结果尚不可用。因此,obj 的结果尚未填充。

如果您想知道何时完成多个异步调用,则必须以非常不同的方式编写代码。结果仅在回调函数内部可用,而不是在函数结束时可用。

总的来说,我看到您的代码有多个问题:

  1. client.get() 是异步的,所以在函数返回时它尚未完成
  2. client.get()调用中,您应该使用i而不是num,以便每次通过for循环生成不同的请求。
  3. 循环中i的值必须在闭包中冻结,以保留其值以供稍后调用的回调函数使用。
  4. 如果obj实际上未定义,则可能是因为您没有将其初始化为空对象。

以下是一种实现方式:

var obj = {};
var remaining = num;
for( var i=1; i<=num; ++i ){
    // create a closure here to freeze the value of i in the callback
    (function(i) {
        client.get(key + ':' + i, function (err, reply) {
            obj[i] = reply;
            // see if all asynch calls are done yet
            --remaining;
            if (remaining === 0) {
                // all asynch calls to client.get() are done now
                // in here, you can use the obj object and the results put on it
            }
        });
    })(i);
}

是的,我想这可能是一个异步问题。而 inum 的区别只是我在输入问题时犯的错误。你的解决方案非常好,谢谢你。 - alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接