使用node-redis获取多个密钥

时间:2013-05-20 04:04:25

标签: javascript node.js asynchronous redis node-redis

我正试图从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 个答案:

答案 0 :(得分:10)

我将根据编码界面以及client.get()异步的评论来冒险。这意味着它会“稍后”调用传递给它的回调函数,而不是立即调用。因此,您不能使用同步编码模式来收集多次调用client.get()的结果,因为obj中的结果在函数返回时尚不可用。因此,obj尚未填充结果。

如果您想知道何时完成多个异步调用,那么您必须以非常不同的方式编码。并且,结果只能在回调函数中使用,而不是在函数末尾。

总之,我发现您的代码存在多个问题:

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

    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);
    }