2017-09-30 20 views
0

私はMongoDB、Redis、NodeJS、socket.ioを使って複数の部屋でチャットアプリを作成しようとしています。私はroomDocumentStateと呼ばれるRedisリストを照会し、その値を変数に戻す必要があります。この変数はグローバルスコープになければならず、変更する必要があります。関数を使ってグローバル変数を更新するには

私が使用しようとしたコードは、関数のローカル変数のみを変更します。私は "閉鎖"と呼ばれるものを読んだ。誰かが私にそれを正しく実装する方法を教えてもらえますか?ここで

はRedisのからデータを引き出し、変数count_1を修正するためのコードです:

function checkRoomDocumentState() { 
    var count_1 = 0; 

    store.llen(roomDocumentState, (err, res) => { 
    if (err) { 
     throw err; 
    } 
    else { 
     if (res > count_1) { 
      count_1 = res; 
      return count_1; 
     } 
    } 
    }); 
} 

だから、この関数は次のように呼ばれて、ここにコードスニペットがあります:

io.sockets.on('connection', client => { 
    createWhiteboardRooms(); 
    sub.subscribe(roomDocumentState); 
    store.lpush(roomDocumentState, event1); 

    //added this to check if there's any value at all 
    checkRoomDocumentState(); 
    console.log(checkRoomDocumentState()); 

    sub.on("message", (channel, message) => { 
     console.log(message); 
     client.send(message); 
    }); 
}); 
+0

あなたは 'count_1'を使用したいどうすればよいですか? – alexmac

+0

基本的に、私はredisリストの値が変更されたかどうかをチェックするこの機能を持っています。この値は 'llen'を使って得られ、count_1に入れられます。そして、2番目の関数はこの変数をチェックし、他のものを実行します。 – jerome

+0

私は、この変数が_initialized_である方法については尋ねませんが、_used_とはどのようになるのでしょうか。 'checkRoomDocumentState'はどこで呼びますか? 'checkRoomDocumentState'が非同期関数であるため、呼び出しの直後にこの変数を使用する場合は、未定義になります。 – alexmac

答えて

0

場合グローバル化する変数がcount_1である場合は、その前にvarというキーワードを削除する必要があります。

しかし、以下のコメントで説明したように、値を渡すコールバックを使用した方がよい:

function doSomethingAsync(resultIsAvailable) { 
    redis.doSomethingElseAsync((err,res) => { 
    result = 'redis told me ' + res; 
    resultIsAvailable(result); 
    }); 
} 

doSomethingAsync((result) => { 
    console.log('my function has been told by redis that ' + result); 
}); 
+0

私の場合、私のIDEで "未定義の変数"エラーが表示されます...申し訳ありませんが、私はちょっと混乱していますし、しばらくこのことをやっています。 – jerome

+0

ユースケースにはグローバル変数を使用しないでください。 1)あなたの関数の署名をcheckRoomDocumentState(resultAvailable)に変更する、2)count_1を計算した関数でresultAvailable(count_1)を呼び出すことがよりクリーンで簡単です。 checkRoomDocumentStateを呼び出すコードで、コールバック関数を指定します。 –

+0

どうすればいいですか?私は今これについて超分かりました。私はそれをどのように実装するのか分かりません。 – jerome

関連する問題