我使用socket.io将数据推送到浏览器以更新其他成员的状态(例如:online / offline / away / busy)。
我发现数据何时到达(每隔10秒)处理页面暂停一会儿。例如:浏览器滚动条(如果您向上/向下移动)将停止片刻并且没有响应。
我不相信问题是websockets,因为如果我不处理数据(例如:它仍然到达浏览器),浏览器就不会挂起。它只在我处理数据时挂起。
下面是我用来处理数据的循环:
我知道我可以更好地定位要更新的元素,而不是使用通用查找(我会这样做)但我仍然非常惊讶这段代码导致网站暂停使用时。
发送的数据大约是100个用户/状态更新,因此我认为它会在100次左右循环,并且必须搜索DOM 100次。这是它挂起的原因吗?它不会在后台处理这个吗?
我想我试图理解悬挂发生的原因。我经常使用jQuery,从未经历过这种情况。所有建议/想法将不胜感激。
答案 0 :(得分:0)
浏览器中的Javascript是单线程的。因此,一次只运行一个Javascript线程。如果你有一些忙于处理传入的webSocket消息的代码,那么在代码完成之前其他Javascript就无法运行。
Javascript通过event queue对所有内容进行排序来强制执行此操作。当一个Javascript完成运行时,JS引擎将下一个事件从事件队列中拉出并运行它。
如果您的页面在传入邮件到达时似乎暂停了一段时间,那很可能是因为处理该传入邮件的Javascript占用了太多时间,并且在页面上进行其他交互等待直到该处理完成。最好的解决方案是提高处理这些传入消息的代码的性能,这样它就足够快,不会对页面的交互性产生明显的影响。
没有通用的方法来加速你的代码 - 最大的区别在于完全取决于具体的代码,它是如何编写的以及它想要完成的。因此,如果您向我们展示实际代码并描述它需要完成的任务,那么您只能收到有关改进代码的更多具体建议。连续做100次意味着每次操作必须非常非常快(每次操作不到几毫秒),如果你不想注意100次操作的累积延迟。