如何在JS socket.io聊天中处理异步用户数据
How to handle asynchronous users data in JS socket.io chat?
我有一个聊天应用程序,可以添加/删除用户。这些是由socket.io 驱动的事件
然后我通过等用户名访问用户
displayData(users[username]);
问题是..用户[用户名]可以在socket.io对我的脚本调用的异步调用中删除。
这将引发一个错误,并将停止所有脚本。
我该如何处理:
即使我像一样测试它
if (users[username]) displayData(users[username]);
这可能发生在用户在测试后被删除之后。
这种情况发生在浏览器JS端。
首先,如果您正在维护自己的用户列表,那么您应该在连接和断开连接事件时更新该列表,这样它就永远不会过时。
其次,浏览器(在这方面)是单线程的。在使用if (users[username])
测试列表和稍后在同一行代码中访问列表之间,无法更改列表。只有当当前运行的活动返回系统时,才能更改它,以便系统可以运行另一个活动(这可能会更改它)。
只有当一个操作让步时,才会发生不同的异步操作——允许任何操作发生。这适用于事件队列。当异步操作发生时,它会将一个项目放入事件队列中。只有当没有其他代码在运行并且该项目到达队列顶部时,该项目才会启动一些正在运行的代码。这样可以确保在同一时间只运行一个操作。在浏览器和节点中都是如此。
如果客户端中的代码想立即知道其他用户是否已经断开连接,那么您根本无法知道。向其他客户端传播事件时会延迟通知他们有人离开了聊天室,因此您永远不会在每个客户端都有完全最新的信息。根据你想做的事情,有一些方法可以处理这些信息的不完整性。你必须更详细地描述你试图解决的问题,以便我们提出解决方案。
相关文章:
- 异步处理所有事件处理程序的方法
- 如何异步处理:函数C取决于函数B取决于函数A
- 如何处理异步获取的数据
- Javascript/JQuery处理并发/异步调用和数据竞争
- 使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
- 直接 Web 远程处理异步问题
- ExtJs 处理异步调用
- 处理异步函数
- 使用Canvas和ForEach处理异步调用
- 处理角控制器中异步更新的正确方法
- 如何在angular.js中处理多个异步任务
- 处理函数中的异步调用(Firebase)
- 节点 JS Express 模块是否异步处理请求
- 异步处理不影响 React+Flux 中视图的数据
- 使用一个小模型来测试异步处理
- 在Node.js中异步处理数组
- 如何在异步处理过程中解析对象
- 使用javascript异步处理多个XMLHTTP请求
- 串行地处理异步处理的消息队列
- 当所有异步处理程序完成时执行javascript函数