Javascript停止间隔函数异步

时间:2013-04-20 11:11:19

标签: javascript asynchronous

我的网页上有以下脚本:

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。我现在意识到这是ajax在不到一秒的时间内没有响应,而且该功能再次被调用。

3 个答案:

答案 0 :(得分: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;

    }
}

答案 1 :(得分:1)

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

启动时获取间隔句柄:

var bountyInterval = setInterval(checkBounty, 1000);

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

clearInterval(bountyInterval);

答案 2 :(得分: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;
  }
}