javascript中的同时代码?

时间:2011-08-10 00:00:27

标签: javascript

如何同时运行两个单独的功能?如果我想要两个时钟,一个计数,另一个计数,我想让它们同时运行,我该怎么做?

如果我刚刚做了:

var up = 1;
while(true){
    document.write(up);
    up++;
    if(up==11)
        up=1;
}
var down = 10;
while(true){
    document.write(down);
    down--;
    if(down==0)
        down=10;
}

......它会继续数数......

4 个答案:

答案 0 :(得分:9)

Javascript是单线程的。只有一个线程可以访问该页面。

在某些HTML5浏览器中可以使用Web Workers在另一个线程中执行某些代码,然后通过消息传递与主线程进行通信,但Web Worker线程无法以任何方式访问DOM。

如果您希望计数器在循环中运行,那么典型的方法是使用计时器,然后在每次计时器运行时设置DOM中对象的内容。通过这种方式,您可以看到同时运行多个事物,但实际上,它们仍然是一次一个,只是单独计时。

以下是“似乎”同时运行的两个计数器的示例:http://jsfiddle.net/jfriend00/3yc9r/

这个代码就是这个(在页面加载后运行):

var cntr1 = 1;
var cntr2 = 2;

setInterval(function() {
    document.getElementById("time1").innerHTML = cntr1 += 13;
}, 33);

setInterval(function() {
    document.getElementById("time2").innerHTML = cntr2 += 5;
}, 44);

另外,你真的不想在循环中做document.write()。将运行一段时间的代码应该在加载页面后运行,并且应该直接修改DOM中的对象,而不是使用document.write()

答案 1 :(得分:2)

您必须将两个计数器放在同一个循环中,但JavaScript本质上是单线程的,您的代码示例会冻结浏览器。尝试使用SetTimeoutSetInterval函数以特定间隔触发事件。 http://www.w3schools.com/js/js_timing.asp

答案 2 :(得分:2)

你没有。 Javascript是单线程的。如果你想要一个时钟,你会使用异步超时。

// Counts up and down by one per second.

var up = 1;
setTimeout(function() {
  up++;
  document.write(up);
}, 1000);

var down = 10;
setTimeout(function() {
  down--;
  document.write(down);
}, 1000);

JS一次只能做一件事(意味着在一个单线程运行循环中),但它非常支持将异步回调连接在一起。

答案 3 :(得分:1)

你不能,如果你在循环中写入身体,它会很慢。

而是使用setTimeout()来运行永久循环的下一次迭代。 https://developer.mozilla.org/en/window.setTimeout