2013-04-20 1 views
-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; 
    } 
} 

이 아약스 포스트를 여러 번 트리거합니다. 어떻게 피할 수 있습니까?

편집이

내가 사용하던 코드로 질문을 업데이트는 위해 clearInterval을 추가하는 것을 잊었다. 이제는 1 초도 채 안되어 응답하지 않는 아약스라는 것을 깨닫고 다시 호출되었습니다.

+0

비동기 적으로 실행되기 때문에가 아니라 여러 개의 ajax 요청을 트리거합니다. 그것의 행동은 – micnic

답변

1

비동기와 아무 관련이 없습니다.

만 그것은 내가 당신이 원하는 것을 생각하는 질문을 다시 읽기 후 한 번

편집을 실행하려는 경우 (이전뿐만 아니라 대답으로)이이 대신하여 setInterval의 setTimeout를 사용해야합니다

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

왜 그냥 아약스 메서드를 먼저 호출 한 다음 타이머를 시작하지 않는가? 타이머 기능에서는 나머지 시간 만 업데이트해야합니다. – Kenneth

+0

@Kenneth : 응답을 기다리지 않고 남은 시간은 * ajax 호출이 완료되기 전 *입니다. – Guffa

1

더 이상 필요하지 않을 때 간격을 멈추지 않으므로 AJAX 호출을 여러 번 트리거합니다. 조건이 계속 true로 유지되면 매번 카운트 다운되고 AJAX 호출을 계속합니다.

var bountyInterval = setInterval(checkBounty, 1000); 

을 그럼 당신은 (AJAX 호출하기 전에)을 중지하고자 할 때 사용합니다 clearInterval 방법 :

clearInterval(bountyInterval); 
+0

바로 아약스에 들어가기 전에 clearInterval을 수행해야합니까? – Samson

+0

@ 샘슨 : 예. 글쎄, 호출이 비동기이기 때문에 실제로는 앞이나 뒤에 바로 실행해도 문제가되지 않지만 전에 수행하는 것은 코드의 의도에 더 부합합니다. – 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; 
    } 
}