暂停JavaScript - setTime

时间:2014-02-24 15:41:49

标签: javascript settimeout

我在http://www.atkinson.yorku.ca/~sychen/research/LMC/LMCHome.html

创建了一个基于Java的小人计算机的JavaScript版本

我通过逐步完成每条指令来完成它。我有一个名为stepCode()的函数来执行此操作。

我想要的是一个运行程序的函数,在每个步骤之间暂停一秒,直到模拟程序结束。

我的代码是:

function runProgram()
{
  var milliseconds = 1000;
  var timeOut;
  programRunning = true;

  while(programRunning)
  {

    timeOut = setTimeOut(stepCode(), milliseconds);      
  }
}

这似乎不起作用。它仍然可以非常快速地一个接一个地执行所有stepCode()调用。我想在每个stepCode()调用之间暂停。

我显然做错了什么。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您应该使用setInterval代替setTimeout。此外,您需要引用该函数,而不是调用函数:

var timeOut; // global timeout variable to ensure both methods have access to it.
function runProgram() {
  var milliseconds = 1000;

  timeOut = setInterval(stepCode, milliseconds); // use setInterval instead of setTimeout
}

function stepCode {
    // ... code processing here ...
    // I assume you are setting programRunning to false at some point in this method.
    // Instead of setting programRunning = false, you would do:
    clearInterval(timeOut);

    // Note, if you only have one timeout interval set, you can use clearInterval();
}

setInterval将导致stepCode函数每隔“毫秒”运行一次,直到您调用clearInterval(timeOut);; setTimeout只会将其排队一次。通过setTimeout排队的任何内容都将在当前代码流完成之后才会执行。因此,programRunning将运行并排队几个setTimeout执行。一旦programRunning变量命中false,当前代码流将完成,所有队列将等待1秒,并有效地同时或快速连续执行所有队列。

当您传入方法调用(例如stepCode())时,它将调用该方法。你必须传递对函数stepCode的引用(注意没有parens),以确保它知道每次执行时要运行什么。

这个Fiddle Demo模拟一个计数器,这是人们尝试使用setInterval执行的常见操作。它演示了setInterval的基本概念和用法。

答案 1 :(得分:1)

除了建议的setInterval使用,它会以1秒的间隔调用stepCode,直到清除(或重新加载页面),并纠正在{{1}之后删除()如果它们被链接,你仍然可以使用stepCode,如下所示。}}导致立即stepCode执行。取决于setTimeout执行的操作以及需要多长时间,此解决方案的优势在于确保在前一个结束和下一个stepCode的开始之间有1秒的空闲时间。< / p>

stepCode

答案 2 :(得分:0)

试试:

timeOut = setInterval(stepCode, milliseconds);

答案 3 :(得分:0)

Bic,谢谢你的迅速回应。你在stepCode()函数中将programRunning标志设置为false是正确的。我已将其设置为全局变量,以便我可以通过按下按钮来暂停程序,但这是另一个问题。

尝试了setInterval和setTimeout。你反复调用这个函数是正确的。使用任一方法都可以通过重复的函数调用锁定浏览器。这可能是它在一个while循环中。我想不出另一个是反复调用stepCode()函数。

我有点理解setInterval和amp;之间的区别。 setTimeout的。谢谢,我明白这会使while循环变得冗余,但是当programRunning标志设置为false时如何停止调用stepCode函数?