【发布时间】:2018-08-19 02:45:50
【问题描述】:
所以,我有一个本地主机网站,您可以在其中按一个按钮来启动一个 while 循环。我的意图是遍历这个while循环并“等待”来自其他按钮的按钮点击,直到135秒过去。然后,它应该退出循环。当代码(嵌入在 html 中)执行时,它只会打印“test1”,而无法离开循环并打印 test2。
allyTrack = 0;
scaleTrack = 0;
enemyTrack = 0;
allyString = ""
scaleString = ""
enemyString = ""
allyClicked = false;
scaleClicked = false;
enemyClicked = false;
function allyAdd(){
allyClicked = true;
}
function scaleAdd(){
scaleClicked = true;
}
function enemyAdd(){
enemyClicked = true;
}
//Making the long vectors
function startGame(){
var startTime = new Date().getTime();
//var currentTime = new Date().getTime();
while(true){
document.getElementById('test').innerHTML = 'test1';
if(allyClicked){
allyTrack += 1;
allyString.append(allyTrack.toString())
allyClicked = false;
}
else if(scaleClicked){
scaleTrack += 1;
scaleString.append(scaleTrack.toString())
scaleClicked = false;
}
else if(enemyClicked){
enemyTrack += 1;
enemyString.append(enemyTrack.toString())
enemyClicked = false;
}
else{
allyString.append(allyTrack.toString())
scaleString.append(scaleTrack.toString())
enemyString.append(enemyTrack.toString())
}
currentTime = new Date().getTime();
if(currentTime-startTime > 2000){
break;
}
}
document.getElementById('test').innerHTML = 'test2';
document.getElementById('list').innerHTML = allyString + '\n' + scaleString + '\n' + enemyString;
}
【问题讨论】:
-
JavaScript 引擎一次只会评估一段代码(单线程)。在
startGame()及其while循环完成之前,无法调用像allyAdd()这样的函数。在迭代之间添加延迟可以让引擎时刻评估其他代码。 – Create a pause inside a while loop in javascript -
只要循环在运行,就没有点击事件。它们会延迟到循环完成后。你只是在冻结你的页面。
-
@JonathanLonowski 因此,如果我在内部创建暂停,它会自动允许时间响应按钮点击。还是按钮点击必须与暂停一致?
-
@RileyFitzpatrick 点击事件将在接下来的两次超时迭代之间运行,因此用户不必在暂停期间点击。每个点击事件和超时都将被添加到一个队列中,引擎一次只处理一个(事件循环)。
标签: javascript while-loop timer infinite-loop