2016-10-17 15 views
1

Nodejsとその非同期的な方法ではあまり経験がありません。 私はredisのさまざまなデータベースを照会しようとしています。Nodejs Redis:同じクライアントを持つ異なるRedisデータベースの複数のクエリ

私はRedisのデータベースからキーを取得するために単純な機能を持っている:

function get_key(client, key, db, callback) { 
    if (key) { 
      client.select(db, function(e, s) { 
        if (e) { 
          console.log('client.select err: ' + e); 
        } else if (s) { 

          client.get(key, function(e, s) { 

            callback(e, s); 
            return s; 
          }); 
        } 
      }); 
    } 

    return 

}

そして、私はこのような複数のデータベースを照会するためにそれを使用しています:

get_key(client, key1, 0, function(e, s) { 
    if (s) { 
      // do stuff with s; 
    } else { 
      debug('e: ' + e); 
    } 
}); 

get_key(client, key2, 1, function(e, s) { 
    if (s) { 
      // do stuff with s; 
    } else { 
      debug('e: ' + e); 
    } 
}); 

をそれは動作していません。しかし、クエリごとに異なるクライアントを作成しても機能します。私は12以上のデータベースでクエリを持っており、クエリを実行するたびに新しいクライアントを作成することを好まないでしょう。

これを行うより良い方法はありますか?私が慣れていない "ノード"の方法?ありがとうございました。

答えて

0

非同期関数は、パラメータとしてコールバック関数を使用します。この関数は即座に近い状態に戻り、呼び出し元をブロックするのではなく作業が完了した後にコールバックが呼び出されます。したがって、最初の呼び出しは、呼び出しが完了する前に戻り、2番目の呼び出しはすぐに行われます。これは、同じクライアントを共有しているため、最初の呼び出しが不正になる可能性があります。

makeを2回しか呼び出していない場合、単純な答えは、2番目の呼び出しを最初の呼び出しのコールバックに入れることです。多くの非同期呼び出しを連続して行う必要がある場合は、promisesまたはasyncなどの利用可能なライブラリの一部を調べてください。

+0

したがって、get_key()関数では、コールバック関数が呼び出される前に最後のリターンが実行されますか?また、外部モジュールを使用せずにnodejsでこれを行う良い方法はありませんか?はい、私は作るためにたくさんの呼び出しがあり、私は好ましくは他のライブラリ/モジュールを使いたくないでしょう。 nodejにはこれをきれいにする方法がありませんか? – anshulv

+0

これは 'if(key)start select request and returnのようなものです。応答が返ってきたら選択を続け、結果と一緒にコールバックを呼び出します。アイデアは、I/O操作が完了するのを待つNodeの単一スレッドをブロックしないことです。ライブラリを使わずにコールバックの中にたくさんのコールバックを入れることができますが、コードは巨大な角括弧のようになります。ライブラリは読みやすさを向上させ、構造を提供し、nodejs固有のものではないため、例えばブラウザのjavascriptでも約束されています。 – leetibbett

+0

ええ、私はnodejsについてほとんど理解していないので、可読性を向上させるためだけに別の外部フレームワークを使用するほうが賢明ではありません。おそらく標準的なlibrarayには含まれていないのではないかと思います。とにかくありがとうございました。私は先に進んで、node-asyncを使ってみましょう。 – anshulv

関連する問題