javascript – 使用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只是未定义.我觉得我可能遇到了问题因为很明显被称为异步.还有另一种方法来实现这一目标吗?我应该只将值存储在有序集中吗?

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

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

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

> client.get()是异步的,所以当你的函数返回时它还没有完成
>您应该在client.get()调用中使用i而不是num,这样每次通过for循环都会生成不同的请求.
>循环中i的值必须在闭包中被冻结,以便保留它在稍后调用的回调函数中使用的值.
>如果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);
}

转载注明原文:javascript – 使用node-redis获取多个密钥 - 代码日志