0

我希望有一些经验丰富的 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));
                });
            }

        }
    });
4

0 回答 0