我在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()调用之间暂停。
我显然做错了什么。有什么想法吗?
答案 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)
尝试了setInterval和setTimeout。你反复调用这个函数是正确的。使用任一方法都可以通过重复的函数调用锁定浏览器。这可能是它在一个while循环中。我想不出另一个是反复调用stepCode()函数。
我有点理解setInterval和amp;之间的区别。 setTimeout的。谢谢,我明白这会使while循环变得冗余,但是当programRunning标志设置为false时如何停止调用stepCode函数?