我希望有一些经验丰富的 Redis 开发人员可以向我解释这背后的逻辑。
我有一个集合作为键,我可以使用此代码提取集合中存储的所有对象;
redisClient.smembers("student_list", function(err,result){
if(err)
console.log(err);
else {
list = result;
console.log(result);
}
});
这工作得很好,但是这个集合包含学生的 id,在另一个 redis 数据库中,我用学生的信息(JSON 字符串)映射了 id。但是,当我像在console.log(result)之后那样在其中放入一个函数时,它不会运行第二个 Redis 查询来获取所有学生的信息。我写过;
for(var i = 0; i < list.length; i++){
console.log(i);
redisClient.get(list[i],function(err,student){
if(err)
console.log("An error occured: "+err);
else
console.log(JSON.parse(student));
});
}
当然,我尝试将此功能放在smembers回调之外。但是,当我这样做时,由于 Node 的异步特性,它只是尝试遍历一个空列表。循环不工作后,我看到 console.log(results) 方法工作,但由于循环通过,我无法获取任何数据。1)我的方法错了吗?2)是否不可能在另一个 Redis 查询的回调函数中调用 Redis 查询。(如果他们是依赖的,可以做些什么来克服?)
PS:当我尝试在另一个回调中运行 Redis 查询时,我收到此错误;
Error in get: Redis connection gone from close event.
PS2:完整代码,以防万一;
redisClient.smembers("student_list", function(err,result){
if(err)
console.log("Err: " + err);
else {
list = result;
console.log(result);
for(var i = 0; i < list.length; i++){
console.log(i);
redisClient.get(list[i],function(err,student){
if(err)
console.log("An error occured: "+err);
else
console.log(JSON.parse(student));
});
}
}
});