gpt4 book ai didi

javascript - 使用 node-redis 获取多个键

转载 作者:IT王子 更新时间:2023-10-29 06:00:26 27 4
gpt4 key购买 nike

我正在尝试从 Redis 实例中获取一堆 key 。我正在使用 Node -redis。我正在使用一个循环:

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

但是 obj 只是未定义的。我觉得我可能有问题,因为 get 显然是异步调用的。还有另一种方法可以实现这一目标吗?我应该只将值存储在排序集中吗?

最佳答案

我将根据编码接口(interface)和您对 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);
}

关于javascript - 使用 node-redis 获取多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16642420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com