2012-10-21 284 views
5

我已经搜索了如何在for循环中使用setTimeOut,但是如何在while循环中使用它并没有太多,我也不明白为什么应该有太大的区别。我已经写了以下代码的一些变体,但是这个循环似乎使浏览器崩溃:setTimeout while while循环

while(src == '') 
{ 
    (function(){ 
     setTimeout(function(){ 
     src = $('#currentImage').val(); 
     $("#img_"+imgIdx).attr('src',src); 
     }, 500); 
    }); 
} 

为什么?

基本上我已图像动态创建的,其源极属性需要时间,有时加载,所以我才可以显示它,我需要保持检查是否它加载与否,并且只有当它的路径是在$('#currentImage')可用,则我会显示它吗?

此代码工作正常之前,我用了while循环,当我直接做

setTimeout(function(){ 
    src = $('#currentImage').val(); 
    $("#img_"+imgIdx).attr('src',src); 
}, 3000); 

但我不希望有使用户等待3秒钟,如果加载可能会做得更快,因此我把setTimeOut放在一个while循环中并缩短了它的间隔,这样我每半秒只检查一次加载的路径。那有什么问题?

+0

不,settimeout将该函数作为参数并稍后执行。 – jrdn

+0

@jrdn我不是在谈''setTimeout'里面的那个,我正在谈论外面的那个。顺便提一下,函数声明实际上并不需要。 –

+0

啊。那个也是。所以是的,我的回答是错误的。这只是一个普通的无限循环! – jrdn

回答

3

谢谢大家 - 所有的建议帮助。最后,我使用了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); 
+0

确认此间隔实际上已被清除。 ['window.clearInterval'](https://developer.mozilla.org/en-US/docs/DOM/window.clearInterval)将'intervalID'作为参数,而不是_function_。 –

+0

我也这么认为......但这确实奏效。首先在这里看到第二个答案:http://stackoverflow.com/questions/109086/stop-setinterval-call-in-javascript – user961627

+0

'我= 0; var fn = function(){ console.log(++ i); (i> 9)console.log('clearing'),clearInterval(fn); }; setInterval(fn,500);'永远持续下去。 –

5

问题可能是你没有检查每半秒。

setTimeout安排一个函数在将来运行,但它不会阻塞,它稍后会运行。因此,在您的while循环中,您将调度这些函数以尽可能快地循环遍历while循环,因此您可能会创建大量函数。

如果你真的想检查每半秒钟,请使用setInterval而不是循环。

+0

setInterval返回一个id。当你想停止它,使用clearInterval(id); – jrdn

+0

https://developer.mozilla.org/zh-CN/docs/DOM/window.clearInterval – jrdn

+0

感谢您的解释。那我拿setInterval块呢? – user961627

9

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

希望这有助于您。