sql >> データベース >  >> NoSQL >> Redis

Nodejs、実行を続行する前にRedisクエリが完了するのを待たない

    file2 / 3は「同じコンテンツ」であるとあなたは言いますが、それらは1つの重要な領域にありません。 promisifyAllに関するBluebirdのドキュメントによる (http://bluebirdjs.com/docs/api/promise.promisifyall.htmlを参照)、この機能は...Asyncを作成します Redisクライアントの各コア機能のバージョン。 hmgetAsyncを呼び出します 最初のケースでは、hmgetのみを呼び出します あなたの他の人に。

    非同期パターンを使用しているが、非同期コード構造を使用しているため、これは重要です。 file2 / 3で、result1を設定します 非同期コールバック内にありますが、呼び出しが返される前に、各呼び出しの下に返します。

    2つの選択肢があります:

    1:redisクライアントに加えてコールバックを渡すことで、file2 / 3 / etcを完全に従来のパターンに変換できます:

    module.exports = function(redisclient, callback){
    

    result1を返す代わりに 、次に、次の値を使用してコールバックを呼び出します:

    if(redisValue == 'test value'){
        callback(null, "success");
    } else {
        callback("failed", null);
    }
    

    2:file2 / 3 / .. NをPromiseベースに変換できます。その場合、promisifyAll(require(...))を実行する必要はありません。 それら-あなたは単にrequire()することができます 彼ら。このようなパターンは次のようになります:

    module.exports = function(redisclient){
        return redisclient.hmgetAsync("testdata", "text1");
    };
    

    これははるかにシンプルでクリーンなオプションです。これを続ければ、require()を削除して、hmgetAsyncを実行することもできます。 ファイル1に、Cassandraから返された適切なデータが含まれています。しかし、特定のアプリケーションのニーズを見ずに知ることは困難です。いずれにせよ、Promiseベースのパターンは一般的にはるかに短く、クリーンですが、常に優れているとは限りません。それらを使用するためのパフォーマンスのオーバーヘッドは中程度です。どちらに行くかはあなたの電話です-どちらでもうまくいきます。




    1. JSONとしてシリアル化されたMongoDBオブジェクト

    2. Mongodbクエリ特定のキーを持つレコードを選択するには

    3. 明示的に接続を閉じる必要がありますか?

    4. MongoDBシャードクラスターのトラブルシューティング