Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JS socket.io聊天中处理异步用户数据?_Javascript_Sockets_Asynchronous_Socket.io - Fatal编程技术网

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

Javascript 如何在JS socket.io聊天中处理异步用户数据?,javascript,sockets,asynchronous,socket.io,Javascript,Sockets,Asynchronous,Socket.io,我有一个聊天应用程序,可以添加/删除用户。 这些是由socket.io驱动的事件 然后我通过用户名访问用户,比如 displayData(users[username]); 问题是。。socket.io在我的脚本上调用的异步调用可以删除用户[username] 这将引发错误并停止所有脚本 我如何处理这个问题: 即使我像这样测试它 if (users[username]) displayData(users[username]); 它可能发生在用户在测试后被删除 这发生在浏览器JS端。首先,如

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

然后我通过用户名访问用户,比如

displayData(users[username]);
问题是。。socket.io在我的脚本上调用的异步调用可以删除用户[username]

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

我如何处理这个问题:

即使我像这样测试它

if (users[username]) displayData(users[username]);
它可能发生在用户在测试后被删除


这发生在浏览器JS端。

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

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

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


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

我说的是浏览器端的JS,而不是服务器端的JS。@user300675-除了如何维护列表之外,答案都是一样的。JS在浏览器中是单线程的,因此列表在您测试它和执行它的时间之间不会改变。