Javascript 在while循环中设置超时
我已经搜索了如何在for循环中使用Javascript 在while循环中设置超时,javascript,while-loop,settimeout,Javascript,While Loop,Settimeout,我已经搜索了如何在for循环中使用setTimeOut,但是关于如何在while循环中使用它的内容并不多,我也不明白为什么会有很大的不同。我已经编写了以下代码的一些变体,但此循环似乎会使浏览器崩溃: while(src == '') { (function(){ setTimeout(function(){ src = $('#currentImage').val(); $("#img_"+imgIdx).attr('src',src);
setTimeOut
,但是关于如何在while循环中使用它的内容并不多,我也不明白为什么会有很大的不同。我已经编写了以下代码的一些变体,但此循环似乎会使浏览器崩溃:
while(src == '')
{
(function(){
setTimeout(function(){
src = $('#currentImage').val();
$("#img_"+imgIdx).attr('src',src);
}, 500);
});
}
为什么?
基本上,我有一个动态创建的图像,其源属性有时需要时间加载,因此在显示它之前,我需要不断检查它是否已加载,并且只有当它的路径在$(“#currentImage”)
中可用时,我才显示它
在我使用while循环之前,以及在我直接使用while循环时,这段代码运行良好
setTimeout(function(){
src = $('#currentImage').val();
$("#img_"+imgIdx).attr('src',src);
}, 3000);
但是如果加载速度可能更快,我不想让用户等待3秒钟,因此我将
setTimeOut
放在while循环中并缩短其间隔,这样我只需每隔半秒检查一次加载的路径。有什么问题吗?问题可能是你没有每半秒检查一次
setTimeout计划函数在将来运行,但它不会阻塞,它只是在以后运行。因此,在while循环中,您正在安排这些函数以尽可能快的速度在while循环中迭代,因此您可能正在创建大量函数
如果您真的想每半秒检查一次,请使用不带循环的setInterval。while循环正在制造麻烦,就像jrdn指出的那样。也许您可以同时使用setInterval和setTimeout,一旦src被填充,就可以清除该间隔。我在这里放置了一些示例代码以提供帮助,但不确定它是否完全符合您的目标:
var src = '';
var intervalId = window.setInterval(
function () {
if (src == '') {
setTimeout(function () {
//src = $('#currentImage').val();
//$("#img_" + imgIdx).attr('src', src);
src = 'filled';
console.log('Changing source...');
clearInterval(intervalId);
}, 500);
}
console.log('on interval...');
}, 100);
console.log('stopped checking.');
希望这能有所帮助。谢谢大家-所有的建议都很有帮助。最后,我使用了setInterval,如下所示:
var timer;
// code generating dynamic image index and doing ajax, etc
var checker = function() {
var src = $('#currentImage').val();
if(src !== '') {
$('#img_' + imgIdx).attr('src', src);
clearInterval(timer);
}
};
timer = setInterval(checker, 500);
不,settimeout将函数作为参数,稍后再执行。@jrdn我不是说settimeout里面的那个,我是说外面的那个。顺便说一句,实际上不需要函数声明。那也是。所以是的,我的答案是错的。这只是一个普通的无限循环!嗯,错了一半。无论如何,他们都应该使用setInterval。@AlvinWong或者,因为它是一个映像,所以钩住它的
.onload
处理程序,该处理程序的设计正是为了让您知道映像何时完成加载。setInterval返回一个id。当您想停止它时,请使用clearInterval(id);谢谢你的解释。那我就用setInterval阻塞?不,它不阻塞。它只是安排函数重复运行,不像setTimeout只安排它运行一次。由于它可以为您处理再次调用,因此您不再需要该循环。请确认此间隔实际上已清除。将intervalID
作为其参数,而不是函数。我也这么认为。。。但这确实有效。首先在这里的第二个答案中看到:i=0;var fn=function(){console.log(++i);如果(i>9)console.log('clearing'),则clearInterval(fn);};设定间隔(fn,500)代码>永远持续。我把console.log(“checking”)
放在clearInterval(checker)
之前,但它并没有永远持续。你完全正确!我试过了,我可以看到它在无限地检查。我已经根据修正修改了上面的答案。