2013-04-20 2 views
-2

У меня есть следующий сценарий на моем веб-странице:Javascript остановить интервал функции асинхр

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; 
    } 
} 

Это вызывает Аякса пост несколько раз, так как оно выполняется асинхр. Как я могу избежать этого?

EDIT

Я обновил этот вопрос с кодом, который я использовал, забыл добавить clearInterval. Теперь я понимаю, что аякс не отвечал менее чем за одну секунду, и функция снова вызывалась.

+0

он запускает несколько запросов ajax не потому, что выполняется асинхронно, а потому это его поведение – micnic

ответ

1

Это не имеет никакого отношения к асинхронному.

Вы должны использовать setTimeout вместо setInterval, если вы только хотите, чтобы выполнить один раз

EDIT После перечитывая вопрос, я думаю, что вы хотите это (как ответил ранее, а):

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; 

    } 
} 
+0

, но я все равно хочу обновлять оставшееся время каждую секунду. Ах, вы имеете в виду, что setTimeout просто для этой должности? – Samson

+1

Почему вы просто не вызываете сначала метод ajax, а затем запускаете таймер? В функции таймера вы должны только обновить оставшееся время – Kenneth

+0

@Kenneth: оставшееся время * до *, вызов ajax выполняется, а не в ожидании ответа. – Guffa

1

Он вызывает вызов AJAX несколько раз, потому что вы не останавливаете интервал, когда он вам больше не нужен. Он будет продолжать отсчет времени и каждый раз вызывать вызов AJAX, поскольку условие будет оставаться истинным.

Получить ручку, чтобы он интервал при запуске:

var bountyInterval = setInterval(checkBounty, 1000); 

Затем, когда вы хотите, чтобы остановить его (перед вызовом AJAX), используйте clearInterval метод:

clearInterval(bountyInterval); 
+0

вправо, я должен сделать clearInterval прямо перед входом в ajax? – Samson

+0

@Samson: Да. Ну, так как вызов асинхронный, на самом деле не имеет значения, делаете ли вы это прямо перед или сразу после этого, но делать это прежде, чем больше соответствует намерению кода. – Guffa

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; 
    } 
} 
Смежные вопросы