2012-04-01 2 views
2

내 ASP.NET MVC 페이지에서 JavaScript/jQuery를 사용하여 매초마다 데이터베이스를 폴링합니다.JavaScript 타이머 재 입력 방지

이 노력하고 있지만 지연이있는 경우이를 반환하기 전에, 내 타이머 핸들러가 다시 호출되지 것입니다 있는지 확인하려면.

거기에서, 전역 변수에 타이머 ID를 저장 내 처리기에서 타이머를 삭제, 내 핸들러가 완료되면 그것을 다시 시작하는 것보다이 다른 어떤 트릭.

참고 : 나는 두 번째가 자주 보이지만이 코드는 신용 카드 지불을 제출 한 후 내 서버를 폴링합니다. 일반적으로 1 초 정도만 실행되며 사용자가 필요 이상으로 오래 기다리는 것을 원하지 않습니다.

답변

5

매초 폴링하나요? 꽤 무거워! setTimeout 대신 setInterval으로 사용하는 경우 제외,이 문제가되지 않습니다

. 후자는 코드 조각이 간격을두고 x 번 실행되고, 전자는 적어도 x 밀리 초의 지연이 있음을 보장합니다.

function some_poller() { 
    $.ajax({ 
     url: '/some_page', 
     success: function() { 
      setTimeout(some_poller, 1000); 
     }, 
     error: function() { // Also retry when the request fails 
      setTimeout(some_poller, 1000); 
     } 
    }); 
} 

// Init somewhere 
some_poller(); 
+0

내가 결과를 얻을 때까지 계속 실행해야하거나 너무 오래 기다렸습니다. 'setTimeout'은 타겟을 한 번만 호출 한 다음 그 함수가 사용하는 내부 타이머를 지우는 것이 맞습니까? 다시 말해,이 함수를 사용할 수 있지만 핸들러가 호출 될 때마다'setTimeout'을 다시 호출해야합니다. –

+0

@JonathanWood'setTimeout'은 아무 것도 지우지 않습니다. ** 한번 ** 함수를 실행해야하기 때문입니다. 반면에'setInterval'은 주어진 함수가 주기적으로 실행되도록합니다. 여전히 혼란스러워하는 경우 링크 된 문서를 읽으십시오. –

1

실제로는 전역 변수를 사용하지 않는 것이 좋습니다. 일부 기능 안에 붙이십시오.

그러나 당신은 당신이 매 초마다 폴링 할 필요가 정말 확신? 그것은 매우 혼란스러운 인터페이스입니다. 내 개인적인 경험에서

0

은 (루트 기능의 내부)는 "글로벌"변수 작품을 아주 잘이 경우 당신은 지우고 다시 시작하는 경우 제어 할 수 있도록. 응답이 실제로 말한 것처럼 빠르면 너무 많은 오버 헤드가 발생해서는 안되고 (정리/재설정) 이러한 유형의 상황을 고려할 수 있습니다.

관련 문제