-2

我的网页上有以下脚本:

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 发布,因为它是异步执行的。我怎样才能避免这种情况?

编辑

我用我正在使用的代码更新了问题,忘记添加 clearInterval。我现在意识到这是 ajax 在不到一秒的时间内没有响应,并且再次调用了该函数。

4

3 回答 3

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

它会多次触发 AJAX 调用,因为您不再需要它时不会停止间隔。它将继续倒计时并每次进行 AJAX 调用,因为条件将继续为真。

启动它时获取他间隔的句柄:

var bountyInterval = setInterval(checkBounty, 1000);

然后当你想停止它时(在 AJAX 调用之前),使用clearInterval方法:

clearInterval(bountyInterval);
于 2013-04-20T11:15:26.343 回答
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 回答