2016-12-07 7 views
-1

シリアル化されたオブジェクトのリストを含むjsonがあります。そして、私はこのjsonを歩いて、そこから2秒に1つのメッセージを表示して停止したい。 私はそれをこのようでした:jqueryタイムアウト内部ループが機能しない

$.ajax({ 
     type: 'GET', 
     url: basename+'/getUnprocessedList/123', 
     dataType: 'jsonp', 
     success: function (data) { 
     for(var i=0, keys=Object.keys(data), l=keys.length; i<l; i++) { 
      console.log('hit '+i); 
      setInterval(processMessage(data[i]),2000); 
      }} 
}); 

しかし、そこに働いて何をするsetIntervalは単に無視され、すべてのメッセージはありません任意のタイムアウトのように、一度に表示しました。私は$をそれぞれ試しました、setTimeout、何も動作しません。そこに何が問題なの?

+0

'processMessage(data [i])'は直ちに関数を呼び出します。 – nicovank

+0

'setInterval()'とhttp:// stackoverflowの呼び出し方法についてはhttp://stackoverflow.com/questions/32770286/javascript-settimeout-doesnt-seem-to-work-like-i-expectを参照してください。 com/questions/1451009/javascript-infamous-loop-変数 'i'の使用に関する問題です。 – Barmar

答えて

0

それはあなたがsetInterval呼び出しですぐに機能を呼び出しているためだ - 無名関数を使用関数を渡すために、あなたは()を省略 - - しかし、あなたはのparamを必要とするため、「

setInterval(function() { processMessage(data[i]) },2000); 

をそして、あなたあなたは、使用できるかどうlet - おそらく

(function(i) { 
    setInterval(function() { processMessage(data[i]) },2000); 
})(i) 

OR(iが実行されている時の最後の反復可能なので、生命維持にそれをラップしますので)iが今間違っているの問題に遭遇するでしょうこの1行でカウントする

for(let i=0, keys=Object.keys(data), l=keys.length; i<l; i++) { 
    setInterval(function() { processMessage(data[i]) },2000); 
} 
+0

これはまだ動作しませんが、data [i]は有効範囲外です。 – Derek

+0

@Derek - 編集中でした。 – tymeJV

+0

ああ、私は今参照してください。 DVを削除しました。 – Derek

2

あまりにも多くのエラー:

 setInterval(processMessage(data[i]),2000); 

正しいバージョン:

setTimeout((function(i){return function(){processMessage(data[i])}})(i), 2000*i); 

あなたの問題:

  • あなた」あなたのforループで直ちに関数を呼び出す - それをラップする機能に
  • iは終わりでスコープの外に行くだろう - それは簡単にi
+0

なぜdownvoteですか?私はテストしました。 – Scimonster

+0

ありがとう、ちょうどチェック - それはヒット+私は5回、次に待機し、すべての5つのメッセージを一度に書き込みます。ここまでのメッセージはありません:( – avalon

+0

@avalonあなたは '2000 * i'を含んでいますか? – Scimonster

1

代わりのを追跡するために作るために、代わりに互い違いの間隔で

  • 閉鎖に使用setTimeoutをあなたの関数をラップforループを使用すると、setIntervalで独自のループ処理を行うことができます。

    success: function (data) { 
        var i=0, keys=Object.keys(data), l=keys.length; 
        var t=setInterval(function(){ 
         processMessage(data[i]); 
         if(++i==l){clearInterval(t)} 
        }, 2000); 
    } 
    

    これは2秒ごとに繰り返され、最後に到達すると停止します。

  • +0

    ありがとうございました!本当に便利です! – avalon

    関連する問題