首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用node-redis获取多个键

使用node-redis获取多个键
EN

Stack Overflow用户
提问于 2013-05-20 12:04:25
回答 1查看 6.3K关注 0票数 3

我正在尝试从一个redis实例中获取一堆密钥。我使用node-redis。我使用了一个循环:

代码语言:javascript
复制
for( var i=1; i<=num; ++i ){
    client.get(key + ':' + num, function (err, reply) {
        obj[num] = reply;
    });
}
return obj;

但是obj只是没有定义。我觉得我可能遇到了问题,因为get显然是异步调用的。有没有其他方法可以做到这一点?我应该只将这些值存储在一个有序的集合中吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-20 12:06:22

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

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

总之,我在你的代码中看到了多个问题:

  1. client.get()是异步的,因此它尚未完成当您的函数返回
  2. 时,您可能应该在client.get()调用中使用i,而不是num,这样每次通过for循环时都会生成一个不同的请求。
  3. 循环中i的值必须冻结在一个闭包中,以便保留它的值以便在以后调用的回调函数中使用。<代码>H216<代码>H117如果D18实际上是未定义的,则可能是因为您没有将其初始化为空对象。<代码>H219<代码>G220

这里有一种方法:

代码语言:javascript
复制
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);
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16642420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档