2012-10-21 21 views
5

setTimeOutをforループで使用する方法を検索しましたが、Whileループで使用する方法はあまりありません。なぜ、どうして大きな違いがあるのか​​わかりません。私は次のコードのいくつかのバリエーションを書いていますが、このループはブラウザをクラッシュさせるようです:setTimeout inside 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

私もそう思っていましたが、これはうまくいきます。最初の2番目の答えでそれを見た:http://stackoverflow.com/questions/109086/stop-setinterval-call-in-javascript – user961627

+0

'i = 0; var fn = function(){ console.log(++ i); if(i> 9)console.log( 'clearing')、clearInterval(fn); }; setInterval(fn、500); 'は永遠に続きます。 –

5

問題はおそらく、半分ごとにチェックしていない可能性があります。

setTimeoutは、将来実行する機能をスケジュールしますが、ブロックしません。後で実行されます。したがって、あなたのwhileループでは、それらの関数がwhileループを反復できるだけの速さで実行するようにスケジューリングしているので、おそらくそれらの関数を作成しています。

実際に0.5秒ごとに確認する場合は、代わりにループなしでsetIntervalを使用してください。

+0

setIntervalはidを返します。それを止めたいときは、clearInterval(id);を使います。 – jrdn

+0

https://developer.mozilla.org/en-US/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.'); 

は、この情報がお役に立てば幸いです。