我正在尝试从一个redis实例中获取一堆密钥。我使用node-redis。我使用了一个循环:
for( var i=1; i<=num; ++i ){
client.get(key + ':' + num, function (err, reply) {
obj[num] = reply;
});
}
return obj;但是obj只是没有定义。我觉得我可能遇到了问题,因为get显然是异步调用的。有没有其他方法可以做到这一点?我应该只将这些值存储在一个有序的集合中吗?
发布于 2013-05-20 12:06:22
根据编码接口和您的评论,我将冒险猜测client.get()是异步的。这意味着它会“稍后”调用传递给它的回调函数,而不是立即调用。因此,您不能使用同步编码模式来收集对client.get()的多次调用的结果,因为当您的函数返回时,obj格式的结果还不可用。因此,obj还没有填充结果。
如果您想知道何时完成多个异步调用,那么您必须以一种非常不同的方式编写代码。而且,结果只在回调函数内部可用,而不是在函数的末尾。
总之,我在你的代码中看到了多个问题:
client.get()是异步的,因此它尚未完成当您的函数返回client.get()调用中使用i,而不是num,这样每次通过for循环时都会生成一个不同的请求。i的值必须冻结在一个闭包中,以便保留它的值以便在以后调用的回调函数中使用。<代码>H216<代码>H117如果D18实际上是未定义的,则可能是因为您没有将其初始化为空对象。<代码>H219<代码>G220这里有一种方法:
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);
}https://stackoverflow.com/questions/16642420
复制相似问题