【问题标题】:How to lock a global array in socket.io如何在 socket.io 中锁定全局数组
【发布时间】:2020-10-08 12:17:26
【问题描述】:

如果我有一个全局数组:

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

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

【问题讨论】:

  • 这取决于“做一些处理”的实际含义。
  • 即它做了一些需要一段时间才能完成的事情
  • 这是否意味着处理是异步的?
  • 不,它是标准的程序代码,尽管它确实会向客户端发出一些发射信号
  • 但同样,您最终只会向连接的用户发送数据。

标签: javascript node.js sockets socket.io


【解决方案1】:

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

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

【讨论】:

  • 这是否意味着即使用户在服务器处理 for 循环时断开连接,用户仍然会在 for 循环中收到事件?如果这是真的,那不会造成问题吗?
  • @AkashAggarwal OP 所指的问题与访问 users 数组有关,他们不应该担心(iff 循环是同步的) .当然,用户可以同时断开连接,但这不会在循环期间更改users 数组(仅在之后)。发射可能会导致服务器注意到用户不再连接,但这也不是什么大问题(socket.io 会处理这个问题)。
  • 谢谢,我想知道 socket.io 是否会导致服务器崩溃。加油!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多