jqueryの各ループからの遅延でデータを表示
-
22-09-2019 - |
質問
私の質問は以下の通りである:
いくつかのJSON配列をループするための最良の方法は、あまりにもしていくつかのデータを示し、どのようなものです 1秒の遅延のような。
それだけ示すつのメッセージの代わりに4 一度ので以下のいずれかが、動作しません
jQuery.each(data.user, function(index, itemData) {
timerid = setTimeout(function(){showMessage(itemData);}, 1000);
});
function showMessage(message){
$('#status_info').html(message);
clearTimeout(timerid);
}
おかげで、リチャード
解決
あなたがたsetIntervalを避けたいとちょうどあなたのリストの長さへの呼び出しをバインドする場合は、閉鎖から1を使用する代わりに、あなたの現在のインデックスを保存し、自己実行中の関数を作成することができます。あなたのsetTimeout関数内の変数が読み込まれる前に、ループが長く終了しますので、クロージャからの変数は、常にあなたの各ループの最後の要素になってしまうでしょう。
また、この文脈では私には意味の全体の多くを作成しませんてclearTimeout関数を呼び出している。
その上で、あなたのsetTimeoutsのすべてが同時にほぼ呼ばしようとしています。これは、(いくつかのケースで見たり速すぎて)離れ画面ミリ秒単位で点滅のすべての値になります。 setTimeout関数は非同期であるため、ループは本当に、ここでは適切ではありません。コールバックのシステムは、実行の有限数のために最善である、とのsetIntervalシステムは、実行の未知の量に最適です。私には実行のあなたの番号は、お使いのjQueryオブジェクトの要素数
(現在お使いの$ .each()を通過しているもの)でなければなりません私はあなたが(私はあなたのDOMへのアクセスを持っていないので、一般)あなたの質問の次に一般の例のように何かをすることをお勧めします。
function showMessage(message){
$('body').html(message);
}
var itemData = [1,2,3,4];
var i = 0;
function idTimer(list, i) {
if (!(i >= 0)) {
i= 0;
}
setTimeout((function(msg){
i++;
return function(){
if(i < list.length){
idTimer(list, i);
}
showMessage(msg);
}
})(list[i]), 1000);
}
idTimer(itemData);
http://jsbin.com/ifuqo の<:このコードのライブデモがで見つけることができます/ P>
他のヒント
の代わりのsetIntervalを試してみてください。
var i = 0;
window.setInterval(function() {
$('#status_info').html(data.user[i++]);
i = i == data.user.length ? 0 : i; // loops the interval
}, 1000);
所属していません StackOverflow