我已经在http://www.atkinson.yorku.ca/~sychen/research/LMC/LMCHome.html上基于Java创建了JavaScript版本的Little Man Computer。

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

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

我的代码是这样的:

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

  while(programRunning)
  {

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


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

我显然做错了。有任何想法吗?

最佳答案

您应该使用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的引用(注意,没有任何括号),以确保它知道每次执行时要运行的内容。

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

10-06 00:46