Я пытаюсь допросить, имеет ли какой-либо из клиентов в комнате определенное свойство, связанное с ними. Асинхронный характер метода socket.io get вызывает у меня проблемы. Я видел библиотеку async, которая выглядит так, как будто это может быть то, что мне нужно, но мне трудно понять, как применить это к этой ситуации.Работа с socket.io async get/set calls
Вот как я хочу, чтобы функция работала, предполагая, что get не был асинхронным;
/**
*
**/
socket.on('disconnect', function(data) {
socket.get('room', function(err, room) {
if(!roomHasProperty(room)) {
io.sockets.in(room).emit('status', { message: 'property-disconnect' });
}
});
});
/**
*
**/
var roomClients = function(room) {
var _clients = io.sockets.clients(room);
return _clients;
}
/**
*
**/
var roomHasProperty = function(room) {
// get a list of clients in the room
var _clients = roomClients(room);
// build up an array of tasks to be completed
var tasks = [];
// loop through each socket in the room
for(key in _clients) {
var _socket = _clients[key];
// grab the type from the sockets data store and check for a control type
_socket.get('type', function (err, type) {
// ah crap, you already went ahead without me!?
if(type == 'property') {
// found a the property type we were looking for
return true;
}
});
}
// didn't find a control type
return false;
}
Есть ли лучший способ сделать это?
Помимо проблемы с асинхронным доступом, я только что заметил, что возвращаю true в обратном вызове, а не в родительский метод. Дурак. –