Javascript 在while循环中设置超时

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);

我已经搜索了如何在for循环中使用
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)
之前,但它并没有永远持续。你完全正确!我试过了,我可以看到它在无限地检查。我已经根据修正修改了上面的答案。