0

setTimeoutを使用して10秒ごとに関数を繰り返したい。私の機能は次のとおりです。

dateInLive = function() {
    crono = function(){
      setTimeout(function() {
        $('.datePoste').each(function(){
                $(this).load('in_live.php','in_live='+$(this).attr('id'))
            });
        crono();
        }
        ,10000);
    }
    crono();
}

しかし、それは本当にランダムです。15秒後、3秒後、6秒後に繰り返されることもあります。

4

5 に答える 5

2

setTimeout繰り返しイベントを実行するために使用しています。

これは正しいです(他の人がsetInterval代わりに推奨していますが、これには問題があります)。

ただし、後続の呼び出しでタイムアウトを設定しているわけではありません。関数を直接呼び出しているだけcrono()なので、最初のタイムアウト遅延の後、すぐに何度も何度も何度も呼び出しを開始します(スタックがなくなるまで)スペース)。

setTimeout()関数を呼び出すたびに呼び出す必要があります。次のように再コーディングします。

dateInLive = function() {
    crono = function(){
        $('.datePoste').each(function(){
            $(this).load('in_live.php','in_live='+$(this).attr('id'))
        });
        setTimeout(crono,10000);
    }
    setTimeout(crono,10000);
}
于 2013-03-26T15:56:14.050 に答える
2

crono()すべてのajaxリクエストが完了したときにのみリコールします。

function crono(){
    setTimeout(function() {
        var arr = [];
        $('.datePoste').each(function(){
            var self = this;
                xhr = $.get('in_live.php', {in_live : this.id}, function(data) {
                    $(self).html( $.parseHTML(data) );
                });
            arr.push(xhr);
        });
        $.when.apply($, arr).done(crono);
    }, 10000);
}
于 2013-03-26T15:59:33.957 に答える
2

この状況では、遅延オブジェクトを使用します。

function crono(){
    setTimeout(function() {
        var defArr = [];
        $('.datePoste').each(function(i,el){
            var deferred = $.Deferred();
            defArr.push(deferred.promise());
            $(this).load('in_live.php','in_live='+$(this).attr('id'), function() {
                 deferred.resolve();
            });
        });
        $.when.apply($,defArr).done(crono);
    }, 10000);
}

このようにすると、すべてのセクションが要求されます。すべてのセクションが受信されたら、10秒待ってから再度要求します。これにより、低速のネットワーク状況で要求が積み重なるのを防ぎます。

于 2013-03-26T16:05:09.467 に答える
0

新しいタイムアウトを作成する前に何かを実行しています。つまり、「ある程度の」遅延が発生する可能性があります。

setInterval()関数を見てください。

于 2013-03-26T15:52:39.437 に答える
0

あなたcrono()は間違った場所に機能を持っているだけです。

dateInLive = function() {
 crono = function(){
 setTimeout(function() {
        crono();
        $('.datePoste').each(function(){
               $(this).load('in_live.php','in_live='+$(this).attr('id'))
           });
        }
        ,10000);
    }

}
于 2013-03-26T15:53:59.057 に答える