-2

Web ページに次のスクリプトがあります。

tid = setInterval(checkBounty, 1000);

function checkBounty(){
    var elapsed = (Date.now()/1000) - parseInt($(".bounty").data('created')) ;
    $(".remaining-time").html(valid - elapsed); //update remaining time until bounty expires
    if (elapsed> valid){
        $.POST('', {id: id}, function(){
           console.log ('bounty cancelled');
           clearInterval(tid);
         });


        //do an ajax post to cancel the bounty;
    }
}

これは、非同期で実行されるため、ajax post を複数回トリガーします。どうすればそれを回避できますか?

編集

使用していたコードで質問を更新しましたが、clearInterval を追加するのを忘れていました。1 秒以内に応答しなかったのは ajax であり、関数が再度呼び出されていたことに気付きました。

4

3 に答える 3

1

間隔が不要になったときに間隔を停止しないため、AJAX 呼び出しが複数回トリガーされます。条件が true であり続けるため、カウントダウンが継続され、毎回 AJAX 呼び出しが行われます。

開始時に間隔のハンドルを取得します。

var bountyInterval = setInterval(checkBounty, 1000);

次に、(AJAX 呼び出しの前に) 停止する場合は、次のclearIntervalメソッドを使用します。

clearInterval(bountyInterval);
于 2013-04-20T11:15:26.343 に答える
1

非同期とは関係ありません。

setTimeout一度だけ実行したい場合は、 setInterval の代わりに使用する必要があります

編集質問を読み直した後、あなたが望むのはこれだと思います(以前にも回答したように):

var intervalid = setInterval(checkBounty, 1000);   // capture the id of the interval

function checkBounty(){
    var elapsed = (Date.now()/1000) - parseInt($(".bounty").data('created')) ;
    $(".remaining-time").html(valid - elapsed); //update remaining time until bounty expires
    if (elapsed> valid){
        clearInterval(intervalid);    // this stops the timer
        //do an ajax post to cancel the bounty;

    }
}
于 2013-04-20T11:12:41.887 に答える
1

インターバルをクリアしてタイマーを破壊する

var timer = setInterval(checkBounty, 1000);

function checkBounty(){
  var elapsed = (Date.now()/1000) - $(".bounty").data('created') ;
  $(".remaining-time").html(valid - elapsed); //update remaining time until bounty expires
  if (elapsed> valid){
    clearInterval(timer);
    //do an ajax post to cancel the bounty;
  }
}
于 2013-04-20T11:27:02.500 に答える