2012-03-16 4 views
2

Node.js와 socket.io를 사용하고 있으며 타이머에 setInterval을 사용하고 있습니다.setInterval이 자체를 반복하지 않도록 보장

다음과 같은 내용이 있습니다. 연결 해제시 간격을 지우고 간격을 설정하기 전에 확인합니다. 그러나 페이지를 많이 새로 고치면 정확하지 않은 것처럼 보입니다. 콘솔 로그는 1 초보다 훨씬 빠른 간격으로 '시간'을 표시하고 함께 그룹화됩니다.

새 타이머가 두 번 이상 초기화되지 않도록하려면 어떻게해야합니까?

socket.on('disconnect', function() { 
    console.log('Disconnected'); 
    clearInterval(timer); 
}); 

if (typeof timer != 'undefined') { 
    clearInterval(timer); 
} 

var timer = setInterval(function() { 
    console.log('time'); 
}, 1000); 
+0

문제를보기 위해 더 많은 코드를 게시해야 할 수도 있습니다. – david

+0

그래서 ... 한 번만 실행하고 싶지만 ... 매 간격마다 코드 블록을 실행하도록 설계된'setInterval'을 사용하고 있습니다. 'setTimeout'을 사용하십시오. –

답변

8

어떤 제안이 새로운 타이머 번 이상은 시작하지 않도록하려면?

setTimeout()이 바로 이러한 작업을 수행하는 것입니다

...

아마도 당신이 의미하는 경우 당신은 setInterval()들이 있다면 스택 이벤트를 일으킬 것이라는 점을 인식 할 필요가 "더 둘째 당 번 이상" 적기에 처리되지 않았다. 이것은 당신의 틈을 1 초도 안되는 원인이 될 것입니다.

유일한 해답은 타임 아웃 처리기 자체 내에서 setTimeout()을 사용하여 새로운 원샷 타이머를 시작하는 것입니다. 자체 콜백 내에서 setTimeout을 반복적으로 호출하면 한 번에 하나의 타이머 이벤트 만 이벤트 대기열에 배치됩니다.

+0

아니요! 'setTimeout'은 한 번만 실행됩니다. 그리고'setInterval'은 매 시간마다 실행됩니다! –

+1

@PashaRumkin 정확히 내 요점입니다. OP는 ** ** 한 번 이상 시작하지 않는 것을 요청했습니다 **. 'setTimeout()'은 정확히 한 번 시작하므로 그 요구 사항을 만족시킵니다. – Alnitak

+0

예, 내 잘못) –

-1

페이지를 다시로드하면 모든 타이머가 종료됩니다. 브라우저에 문제가 있습니다. 1 초 간격을 만들고 alert으로 전화하면 알림 시간이 으로 끝나고 Mozilla의 SpiderMonkey 간격 이벤트가 1 초가되며이라고 표시된 일 때 Google의 V8이 1 초 후에 실행됩니다. 엔진의 코드 흐름 구성이 다르기 때문입니다.

+0

이 타이머는 브라우저에서 실행 중이 아니며 노드 서버에서 실행 중입니다. – david

관련 문제