0

この背後にあるロジックを説明できる経験豊富な Redis 開発者がいることを願っています。

キーとしてセットがあり、このコードでセットに格納されているすべてのオブジェクトをプルできます。

redisClient.smembers("student_list", function(err,result){
        if(err)
            console.log(err);
        else {
            list = result;
            console.log(result);
        }
    });

これは完全に正常に機能しますが、このセットには学生の ID が含まれており、別の redis データベースで、ID を学生の情報 (JSON 文字列) にマップしました。ただし、 console.log(result)の後に関数を配置すると、すべての学生の情報を取得する 2 番目の 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コールバックの外に置いてみました。ただし、これを行うと、ノードの非同期の性質により、単に空のリストを上書きしようとします。ループが機能しない後、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