终止另一个函数的活动javascript函数/循环

终止另一个函数的活动javascript函数/循环,javascript,Javascript,我有一个javascript循环,每当页面通过websocket收到更新时就会触发。即使在收到下一次websocket更新后,此循环通常仍会持续。结果是多个循环开始运行,页面性能迅速下降。不过,每个循环都很关键,只有在下次更新之前才会过时 有没有一种方法可以终止另一个函数的活动循环,或者我只是想用错误的方法来终止活动循环?通常,您会在循环之外设置一个标志/条件,在每次迭代中都会检查该标志/条件 所以 在你的情况下,我认为你可以有一个更新队列。因此,您的循环将检查队列-查看它自上次执行它的操作以来

我有一个javascript循环,每当页面通过websocket收到更新时就会触发。即使在收到下一次websocket更新后,此循环通常仍会持续。结果是多个循环开始运行,页面性能迅速下降。不过,每个循环都很关键,只有在下次更新之前才会过时


有没有一种方法可以终止另一个函数的活动循环,或者我只是想用错误的方法来终止活动循环?

通常,您会在循环之外设置一个标志/条件,在每次迭代中都会检查该标志/条件

所以


在你的情况下,我认为你可以有一个更新队列。因此,您的循环将检查队列-查看它自上次执行它的操作以来有四次更新-然后它执行它所执行的任何操作。新的websocket更新进入-循环完成它正在做的事情-返回并再次检查队列。

通常,您会在循环外部设置一个标志/条件,在每次迭代中检查该标志/条件

所以



在你的情况下,我认为你可以有一个更新队列。因此,您的循环将检查队列-查看它自上次执行它的操作以来有四次更新-然后它执行它所执行的任何操作。新的websocket更新进入-循环完成它正在做的事情-返回并再次检查队列。

循环中有一个查找全局标志的条件,当收到更新时,将标志设置为False

循环中有一个查找全局标志的条件,当收到更新时,将标志设置为False

我觉得你想得不对。除非有“web工作者”参与,否则您的浏览器JavaScript环境完全是单线程的。因此,单个页面不可能同时运行多个事件循环。我认为您的想法是错误的。除非有“web工作者”参与,否则您的浏览器JavaScript环境完全是单线程的。因此,单个页面不可能同时运行多个事件循环。当循环在单线程环境(如浏览器)中运行时,其他JavaScript代码如何设置标志?@Pointy仔细想想。如果浏览器本身是单线程环境,则在加载文档时无法访问主菜单。处理样式表时无法读取文档。在任何意义上,浏览器都不是单线程的。客户端脚本执行通常是。因此,如果一个脚本引擎线程共享相同的运行时环境,则可以使用一个脚本引擎线程来影响另一个脚本引擎线程,如本例所示。该线程可以是事件线程,也可以是使用
window.setTimeout(…)
@PointedEars创建的。重点是浏览器中的JavaScript是单线程的(每个窗口或每个选项卡)。在web workers之外,浏览器中的东西不是多线程的,这包括web套接字交互(据我所知)。@Pointy First。另外,没有规定ECMAScript实现(在浏览器中)总是单线程的;我们只有在浏览器中观察才能做出有根据的猜测。From遵循事件侦听器模型。此类模型是主体对象的一部分。对于服务器实现来说,为每个侦听器调用在同一运行时环境中创建一个新的脚本引擎线程是可能的,也是有意义的。@PointedEars我意识到JavaScript有不同的实现,但我向您提供100%铁的保证,抛开新的“web worker”功能,所有浏览器都运行JavaScript单线程,而且它们总是这样。这个问题几乎肯定是关于浏览器中的JavaScript(“每次页面收到更新…”)。当循环在单线程环境(如浏览器)中运行时,其他JavaScript代码如何设置标志?@Pointy仔细想想。如果浏览器本身是单线程环境,则在加载文档时无法访问主菜单。处理样式表时无法读取文档。在任何意义上,浏览器都不是单线程的。客户端脚本执行通常是。因此,如果一个脚本引擎线程共享相同的运行时环境,则可以使用一个脚本引擎线程来影响另一个脚本引擎线程,如本例所示。该线程可以是事件线程,也可以是使用
window.setTimeout(…)
@PointedEars创建的。重点是浏览器中的JavaScript是单线程的(每个窗口或每个选项卡)。在web workers之外,浏览器中的东西不是多线程的,这包括web套接字交互(据我所知)。@Pointy First。另外,没有规定ECMAScript实现(在浏览器中)总是单线程的;我们只有在浏览器中观察才能做出有根据的猜测。From遵循事件侦听器模型。此类模型是主体对象的一部分。对于服务器实现来说,为每个侦听器调用在同一运行时环境中创建一个新的脚本引擎线程是可能的,也是有意义的。@PointedEars我意识到JavaScript有不同的实现,但我向您提供100%铁的保证,抛开新的“web worker”功能,所有浏览器都运行JavaScript单线程,而且它们总是这样。这个问题几乎可以肯定是关于浏览器中的JavaScript(“每次页面收到更新时…”)。这正是我所需要的,非常感谢您的帮助。如果SO允许,我会接受它:)Web套接字不提供多线程,是吗?当这个事件循环运行时,任何代码如何设置标志?我能够处理这个问题的方法是设置一个全局变量,该变量包含与最近更新相关的时间戳。然后“flag”检查循环是否与全局时间戳匹配。@Pointy我必须仔细检查多线程,但我只是触发了多个javasc
while(true){
    // Do stuff
    if(condition == false){
       break;
    }
}