Javascript 如何在socket.io中锁定全局数组

Javascript 如何在socket.io中锁定全局数组,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,如果我有一个全局数组: var users = new Array(); 我想在我的所有客户中维护该阵列: socket.on('connect', function() { users.push(socket.id); }); socket.on('disconnect', function() { users.splice(users.indexOf(socket.id), 1); }); 如果我有另一个功能: socket.on('new_score', functi

如果我有一个全局数组:

var users = new Array();
我想在我的所有客户中维护该阵列:

socket.on('connect', function() {
    users.push(socket.id);
});

socket.on('disconnect', function() {
    users.splice(users.indexOf(socket.id), 1);
});
如果我有另一个功能:

socket.on('new_score', function(s) {
    for (u in users) {
        ...
        do some processing
        ...

        io.sockets.connected[users[u]].emit('new_score', socket.id, s);

        ...
        do some processing
        ...
    }
});
由于socket.io是异步的,所以当我在最后一个函数中调用emit时,用户可能已在disconnect中被删除


因此,我需要一种方法来安全地访问阵列,让所有其他函数异步操作它…

如果整个
for
循环是同步的(或者不依赖于异步函数的结果),那么您就不用担心了


整个循环将在同一个“勾选”中处理,任何消息(如
断开连接
)都将在勾选结束时处理。

这将取决于“进行一些处理”的实际含义。它做的事情需要一段时间才能完成,这意味着处理是异步的吗?不,这是标准的过程代码,虽然它确实会向客户端发出一些信号,但最后你只向连接的用户发出信号。这难道不意味着即使用户在服务器处理for循环时断开了连接,用户仍然在for循环中收到事件?如果这是真的,那不会导致问题吗?@AkashAggarwal OP所指的问题与访问
用户
数组有关,他们不应该担心(如果循环是同步的)。当然,用户可以同时断开连接,但这不会在循环期间(仅在之后)更改
users
数组。发射可能会导致服务器注意到用户不再连接,但这也不是什么大问题(
socket.io
将处理该问题)。谢谢,我想知道socket.io是否会使服务器崩溃。你上去!