我需要让一段代码始终独立于其他代码运行。有没有办法在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);
它会抛出“过多的递归”。
答案 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/
答案 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可以尝试循环而不是递归