0

コードに (おそらくばかげた) 問題があります。私はこのようなものを持っています:

io.sockets.on('connection', function(socket)
{
    var list = {};

    socket.on('event', function(data){
        if(!list[data.field_name]){
            list[data.field_name] = [];
            // db and collection already defined
            var collection = new mongodb.Collection(db, coll);
            collection.find({
                field: data.field_name,
            }).toArray(function(err, results){
                list[data.field_name] = results[results.length-1];
                socket.emit('another-event',{
                    list:list[data.field_name];
                });
            });
        } else {
            socket.emit('another-event',{
                list:list[data.field_name];
            });
        }

    });
}

私は基本的にデータベースの結果をリストにキャッシュし、データベースからすでに取得されている場合は直接(データベースクエリなしで)送信しようとしています。

私が抱えている問題は、割り当てlist[data.field_name] = results[results.length-1]が機能しないことです。したがって、以前にデータを取得しようとしてlist[data.field_name]初期化され[]たが、後で割り当てられたデータが含まれていない場合。

明確にするために、データベースからデータを正常に取得し、データベースから初めて取得したときにクライアントに適切に送信します。問題が発生するのは、キャッシュされたコピーを送信しようとしたときです。キャッシュされたコピーがありません。

これはnodejs(およびmongodbクエリ)が非同期であることと関係があることは知っていますが、これを機能させる方法がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

0

another-eventコレクションへのクエリが完了する前に発行しています。が発行されたときにデータがまだ取得されていない場合は、another-eventまだlist[data.field_name]空です。次のようなものを試してください:

io.sockets.on('connection', function(socket)
{
    var list = {};

    socket.on('event', function(data){
        var anotherEvent = function() {
            socket.emit('another-event',{
                list:list[data.field_name];
            });
        };

        if(!list[data.field_name]){
            list[data.field_name] = [];
            // db and collection already defined
            var collection = new mongodb.Collection(db, coll);
            collection.find({
                field: data.field_name,
            }).toArray(function(err, results){
                list[data.field_name] = results[results.length-1];
                anotherEvent();
            });
        } else {
            anotherEvent();
        }
    });
}
于 2012-08-03T21:17:32.860 に答える