我想要创建一个真正的线程来管理javascript中的一些操作。经过几次搜索,我找到了“网络工人”、“setTimeout”或“setInterval”。
最后,我需要一个无限循环,它一个接一个地执行一系列操作。它是否存在,还是我必须满足于'setInterval'?是否有jQuery或其他的替代方案?如果不是,那么在不久的将来,我能期待开发人员提供它吗?
发布于 2015-11-22 17:25:52
我假设你是在网络浏览器里说的。
web浏览器中的JavaScript只有一个主UI线程,然后是零或多个web工作线程。Web工作人员确实与主UI线程(以及彼此)隔离,因此无法访问全局(除了他们自己的)。这是有意的,它使实现环境和使用它大大简化,减少了错误的发生。(即使没有强制隔离,多线程编程也是很好的做法。)您通过postMessage和message事件向web工作者发送消息,并从他们那里接收消息。
JavaScript线程(主UI线程和任何web工作者)通过特定于线程的任务队列(也称为“作业队列”)工作:任何需要在JavaScript线程上发生的事情(页面加载、事件处理、计时器回调时的代码初始运行)都会将任务添加到队列中。JavaScript引擎运行一个循环:获取下一个任务,运行它,拾取下一个任务,运行它,等等。当没有任务时,线程会安静地等待任务到达。
setTimeout不创建单独的线程,它只是调度一个任务(对回调的调用),以便在延迟(超时)之后添加到该线程的任务队列中。一旦超时发生,任务就会排队,当任务到达队列前面时,线程将处理它。
setInterval和setTimeout完全一样,但是安排了一个经常性的回调:一旦超时发生,它就会排队,然后设置另一个超时,以便稍后再对任务进行排队。(围绕时间的规则有点复杂。)
如果您只想让某件事情永远地、隔一段时间重新出现,并且希望它能够访问主UI线程中的全局变量,那么您可以:
setInterval once,它将设置对代码的重复调用,或setTimeout,每次您得到回调时,再次使用setTimeout来调度下一个回调。根据您的描述,听起来您可能不止一次地调用setInterval (例如,每次回调),当您不断告诉它要做越来越多的工作时,它很快就会陷入线程的泥潭。
发布于 2015-11-22 17:24:20
最后一件事很容易:当网络工作者收到消息到(onmessage)时就开始工作,否则就无所事事。(当然,这是高度简化的)。
全局变量对于真正的多线程是不好的,更糟糕的是,JavaScript提供了更少的东西。你必须重写你的工人,使其独立工作,只需提供信息。
子工作人员有一个消息传递系统,您可以很好地利用这个系统。
但是JavaScript的主要问题是:一旦异步,总是异步的。没有办法“加入”线程或"wait4“或类似的东西。唯一能做到这两种功能的是XMLHttprequest,所以您可以在you服务器上这样做,但我怀疑导致的滞后会有什么好处。顺便说一句:同步XMLHttprequest是不推荐的,Mozilla说,它还有一个页面,列出了所有需要同步请求的地方,或者至少非常有用的页面。
https://stackoverflow.com/questions/33857621
复制相似问题