javascript中的线程(或类似的东西)

时间:2010-11-16 13:28:15

标签: javascript multithreading

我需要让一段代码始终独立于其他代码运行。有没有办法在javascript中创建一个线程来运行这个函数?

- 为什么setTimeout对我不起作用

我尝试过,但它只运行一次。如果我以递归方式调用该函数,它会在一段时间后抛出“过多的递归”错误。我需要每100毫秒运行一次(这是与嵌入式系统的通信)。

- 正如您所问,这里有一些代码

function update(v2) {
     // I removed the use of v2 here for simplicity
     dump("update\n"); // this will just print the string
     setTimeout(new function() { update(v2); }, 100); // this try doesn't work
}
update(this.v);

它会抛出“过多的递归”。

6 个答案:

答案 0 :(得分:4)

我假设您要求在不同的线程上执行函数。但是,Javascript不支持多线程。

请参阅:Why doesn't JavaScript support multithreading?

所有当前浏览器中的Javascript引擎都在单个线程上执行。如上面的帖子所述,在不同的线程上运行函数会导致并发问题。例如,两个函数同时修改单个HTML元素。

答案 1 :(得分:3)

正如其他人所指出的,也许多线程并不是你实际需要的。 setInterval可能就足够了。

但是,如果您真的需要多线程,JavaScript会通过Web worker功能支持它。基本上,主JavaScript线程只能通过事件和消息传递(字符串,本质上)与其他线程(工作者)进行交互。工作人员无权访问DOM。这可以避免任何并发问题。

以下是网络工作者规范:http://www.whatwg.org/specs/web-workers/current-work/

更多辅导治疗:http://ejohn.org/blog/web-workers/

答案 2 :(得分:2)

window.setTimeout()就是你所需要的。

答案 3 :(得分:2)

删除您传递给setTimeout()的函数的new关键字,它应该有效。

function update(v2) {
 try {
     dump("update\n");
 } catch(err) {
     dump("Fail to update " + err + "\n");
 }
 setTimeout(function() { update(v2); }, 100);
}
update(this.v);

或者只使用setInterval()

function update(v2) {
 try {
     dump("update\n");
 } catch(err) {
     dump("Fail to update " + err + "\n");
 }
}
var this_v = this.v;
setInterval(function() {update(this_v);}, 100);

编辑:在变量中引用this.v,因为我不知道您的应用中this的值是多少。

答案 4 :(得分:1)

也许您应该查看javascirpt Workers(专用Web Workers为Web内容提供了一种在后台线程中运行脚本的简单方法),这里有一篇很好的文章,解释了它是如何工作的,以及我们如何使用它。 HTML5 web mobile tutororial

答案 5 :(得分:0)

U可以尝试循环而不是递归