0
for (i=0 ; i < pri.state.totalConversations; i++) {
            redisclient.lindex("conversationsIDList",i, function(err,reply) { 
            convID = reply;
            console.log("ConvID: " + "i: " + i + " "+  convID);         
});
          if(convID == pri.state.lastUpdatedConversationID)
            break;
            redisclient.hget("conversations", convID, function(err,reply) {
            console.log("ConvID hget: "+ convID + " "+ reply);
                data = JSON.parse(reply);
                console.log("data: " +data);

            });

上記は私のコードのスニペットです。redis-cli hget コマンドは、正しいキーとフィールド/値でハッシュが正しく設定されていることを確認する正しい答えを返します。ただし、上記のコード スニペットは hget に対して「null」を返します (convID には hget のフィールドである正しい値があります) - 理由がわかりません -

4

2 に答える 2

1

問題は Redis にあるのではなく、node.js 非同期プログラミングの理解にあるのです。Redis クライアント ライブラリは非同期です (ほとんどの node.js ライブラリと同様)。同期であるかのように使用することはできません。

hget コマンドは、Redis が lindex コマンドの結果を送信する前に送信されます。convID 変数が、期待した時間に、期待した値に設定されていません。for ループは、結果が処理される前に終了します。

convID に依存するすべてのコードを lindex のコールバックに配置する必要があります。おそらく、すべての結果が処理されたときに呼び出される追加のコールバックが最後に必要になるでしょう。

For loop get items from redis delayの例を参照してください

于 2012-06-10T10:24:09.970 に答える
1

convIDredisclient.lindexコールバックが戻るまで設定されません。これは、ループが長く終了するまで発生しませんfor(ノードのイベント ループは、ループから出るまで実行されないため)。大量の非同期リクエストを送信しredisclientて、それらのいずれかが戻ってくるのを待っていません。

あなたが何をしたいのかを正確に伝えるのは少し難しいですが、Async のようなフロー制御ライブラリを調べることをお勧めします。

最初に成功したコールバックによって設定され、後続のコールバックにその結果を無視するように指示するブール型フラグ変数 (モジュールまたはループを開始した関数にスコープされる) を定義できる場合があります。しかし、私はちょうど推測しています。主な問題は、非同期環境で同期制御フローを使用しようとしていることです。

于 2012-06-10T10:16:28.563 に答える