我的代码有一个(可能是愚蠢的)问题。我有这样的事情:
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];
});
}
});
}
我基本上是尝试将db结果缓存到列表中,并直接发送它(没有数据库查询),如果它已经早先从数据库中检索过。
我遇到的问题是作业list[data.field_name] = results[results.length-1]
不起作用。因此,如果它之前已尝试检索数据,list[data.field_name]
已初始化为[]
,但它不包含之后分配给它的数据。
要清楚,它确实从db中检索数据,并在第一次从数据库中检索时正确地将其发送到客户端。当我尝试发送出现问题的缓存副本时 - 没有缓存副本。
我知道这与nodejs(和mongodb查询)是异步的有关,但我似乎无法弄清楚如何使这个工作。任何帮助将不胜感激。
答案 0 :(得分: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();
}
});
}