javascript - 如何在 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', 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 时,用户可能已在断开连接中被删除。

所以我需要一种方法来安全地访问数组,所有这些其他函数都异步操作它......

最佳答案

如果整个 for 循环是同步的(或者不依赖于异步函数的结果),则您无需担心。

整个循环将在同一个“tick”中处理,任何消息(如 disconnect)都将在 tick 结束时处理。

关于javascript - 如何在 socket.io 中锁定全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37880796/

相关文章:

node.js - 创建闭源 npm 包

javascript - 使用函数内检索和更新的数据更新数组

java - 套接字关闭前的长时间延迟

java - Jedis Subscribe thread get Connection time out exception 每一个固定的时间间隔

c - linux在c中跨线程连接到相同的sockaddr

javascript - 如何将 AJAX 与 Isotope 接受的 JSON 文件结合使用?

javascript - 清除 Angular UI Bootstrap typeahead 上的 $viewValue

javascript - 是否可以对 JavaScript 而不是 ASP 进行 AJAX 调用?

javascript - 当用户单击按钮时显示 div 元素的错误

node.js - 如何仅使用 npm 获取当前包的版本