我试图在函数有无限循环的情况下超时。但是下面的方法不起作用。知道为什么以及如何解决它?
setTimeout(clearValues,1000);
function clearValues(){
i=0;
alert("hi "+i);
}
i=19
function infin(){
while(i>0){
console.log(i);
i++;
}
alert("Done");
}
infin();
在下面的例子中,我显示警报(比预期的晚一点),控制台语句甚至在警报后继续打印。这意味着在这种情况下,setTimeout不会等待循环结束。对此有何解释?
setTimeout(clearValues,500);
function clearValues(){
alert("clear");
}
function infin(){
for(i=0;i<10000;){
i=i+0.3;
console.log(i);
}
}
infin();
答案 0 :(得分:3)
setTimeout
异步工作,意味着它将在1000ms 之后运行并完成上一个事件循环。由于while循环永远不会完成,因此永远不会调用回调。
如果要退出,请在循环中添加条件。
答案 1 :(得分:1)
另一种解决方案可能是使用间隔:
var code = function(){
console.log('tick');
};
var clock = setInterval(code, 200);
当你不再需要它时:
clearInterval(clock);
答案 2 :(得分:0)
当您使用略有不同的更改进行infin
通话时,它可以正常工作。
var i = 0;
setTimeout(clearValues, 1000);
var interval = setInterval(infin, 0);
function clearValues() {
out("clear");
clearInterval(interval);
}
function infin() {
if (i < 10000) { // if you be shure that you
i++;
out(i);
} else { // never reach the limit,
clearInterval(interval); // you can remove the four
} // commented lines
}
function out(s, pre) {
var descriptionNode = document.createElement('div');
if (pre) {
var preNode = document.createElement('pre');
preNode.innerHTML = s + '<br>';
descriptionNode.appendChild(preNode);
} else {
descriptionNode.innerHTML = s + '<br>';
}
document.getElementById('out').appendChild(descriptionNode);
}
<div id="out"></div>