gpt4 book ai didi

javascript - NodeJS + MongoDB 异步结果出现较晚

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:35 25 4
gpt4 key购买 nike

我有一个简单的函数,它返回 channel 中已连接用户的列表,我在初始阶段使用它和一个简单的数组,但是我想从 mongodb 数据库中检索一些用户详细信息并将其添加到该数组。

我遇到的问题是返回给出了空结果,我稍后可以在控制台日志中清楚地看到,这是因为查询运行较晚并且返回在返回结果之前正在运行。

我知道这是因为异步函数,我已经尝试过 Q 和其他函数,但我就是无法让它工作。 :(

//GET USERS FOR SPECIFIED ROOM
function get_room_users( room ){

// create an array to hold all the usernames of the poeple in a specific room
var roomusers = new Array();

// get all the clients in ‘room1′
var clients = io.sockets.clients( room );

var i = 0;

for(var i = 0; i < clients.length; i++) {

db.users.findOne( { email: clients[i].username }, function(err, userdata) {

if( err || ! userdata ){

console.log('no user found');

} else {
console.log("DISPLAYING USER DATA: " + userdata.nickname);
roomusers[roomusers.length] = userdata.nickname;


console.log("HERE THE CONSOLE SHOWS ROOMUSERS FILLED IN");
console.log(roomusers);

i++;

}

});

}

console.log("HERE THE ARRAY LOOKS EMPTY BEFORE SENDING BACK");
console.log(roomusers);

return roomusers;


}

var users = get_room_users(room1);

console.log("HERE THE ARRAY LOOKS EMPTY!")
console.log(users);

控制台日志结果

HERE THE ARRAY LOOKS EMPTY BEFORE SENDING BACK
[]
HERE THE ARRAY LOOKS EMPTY!
[]
HERE THE CONSOLE SHOWS ROOMUSERS FILLED IN
['user@user.com']

最终解决:好的,正如一位用户评论的那样,我正在以同步模式思考,我在 bucle 解决后更改了发出方法,以便在一切完成后发出。请记住,我正在使用 Q 来创建 Promise :)

//获取指定房间的用户函数 get_room_users( 房间 ){

var the_promises = [];

// create an array to hold all the usernames of the poeple in a specific room
var roomusers = new Array();

// get all the clients in ‘room1′
var clients = io.sockets.clients( room );

clients.forEach(function (socket) {

var deferred = Q.defer();

db.usuarios.findOne( { email: socket.username }, function(err, userdata) {

if( err || ! userdata ){

console.log('no user found');
deferred.reject();

} else {
console.log("DISPLAYING USER DATA: " + socket.username);
roomusers[roomusers.length] = socket.username;

console.log("DENTRO DEL BUCLE");
console.log(roomusers);

deferred.resolve();

}

});

the_promises.push(deferred.promise);


});


Q.all(the_promises).done( function(){
console.log("ALL THINGS DONE!");
// broadcast to everyone in room 1 the usernames of the clients connected.
io.sockets.to( room ).emit('updateroomusers', roomusers);
} );

}

最佳答案

我建议您使用 Q Promises ( https://npmjs.org/package/q )。 Promises 是一个非常强大的异步操作调度工具。

关于javascript - NodeJS + MongoDB 异步结果出现较晚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com