如何在JS socket.io聊天中处理异步用户数据?

时间:2014-11-07 17:08:13

标签: javascript sockets asynchronous socket.io

我有一个添加/删除用户的聊天应用程序。 这些是由socket.io

驱动的事件

然后我按用户名(如

)访问用户
displayData(users[username]);

问题是..在socket.io调用我的脚本的异步调用中可以删除用户[username]。

这会引发错误并停止所有脚本。

我该如何处理:

即使我像

那样进行测试
if (users[username]) displayData(users[username]);

可能会在测试后删除用户。

这发生在浏览器JS方面。

1 个答案:

答案 0 :(得分:0)

首先,如果您要维护自己的用户列表,那么您应该在连接和断开事件时更新该列表,以便它永远不会过时。

其次,浏览器(在这方面)是单线程的。使用if (users[username])测试时间与稍后在同一行代码中访问列表的时间之间无法更改列表。它只能在当前正在运行的活动返回到系统时更改,以便系统可以运行另一个活动(可能会更改它)。

只有当一个操作产生时才会发生不同的异步操作 - 允许任何操作发生。这适用于事件队列。发生异步操作时,它会将一个项放在事件队列中。该项目只会在没有其他代码运行时以及该项目到达队列顶部时启动一些代码。这确保了只有一个动作实际上同时运行。在浏览器和节点中都是如此。


如果您的客户端中的代码想要立即知道其他用户是否已经断开连接,那么您根本无法知道。向其他客户传播事件有延迟,通知他们某人已离开聊天,因此您不会在每个客户端获得完整的最新信息。根据您正在尝试做的事情,有一些方法可以处理这些信息的不完善之处。您必须更详细地描述您为解决问题而尝试解决的问题。