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

How to handle asynchronous users data in JS socket.io chat?

本文关键字:异步 处理 用户 用户数 数据 聊天 JS socket io      更新时间:2023-09-26

我有一个聊天应用程序,可以添加/删除用户。这些是由socket.io 驱动的事件

然后我通过等用户名访问用户

displayData(users[username]);

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

这将引发一个错误,并将停止所有脚本。

我该如何处理:

即使我像一样测试它

if (users[username]) displayData(users[username]);

这可能发生在用户在测试后被删除之后。

这种情况发生在浏览器JS端。

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

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

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


如果客户端中的代码想立即知道其他用户是否已经断开连接,那么您根本无法知道。向其他客户端传播事件时会延迟通知他们有人离开了聊天室,因此您永远不会在每个客户端都有完全最新的信息。根据你想做的事情,有一些方法可以处理这些信息的不完整性。你必须更详细地描述你试图解决的问题,以便我们提出解决方案。