2012-04-27 2 views
0

안녕 모두이 코드는 여기에 게시 한 계산하려면 : http://jsfiddle.net/mN6Gy/12/얻기 카운트 다운이 제대로

문제는 초에 숫자를 생략한다 (30, 25에서 간다, 24, 23, 22, 21, 20, 15, ...)

그리고 초가 00에 도달하면 99, 98, 97, 96 ...에 다시 시작됩니다.

코드에서 찾으려면 도움이 될 것입니다. 카운터가 x 적은 수를 계산, x초 후 -

감사합니다,

데이비드 일반적으로

+0

당신 (조건부) 최대 자리수 코드 블록 - 논리가 결함이있을 것입니다. 왜냐하면 분명히 항상 최대 초의 5 자리 숫자가 2이므로 21 (21 ... 20 ... 15)가되고 최대 9 자리 숫자는 1입니다. 우리 모두가 알고있는 것은 잘못된 것입니다. –

답변

1

오 소년이 디버그로했다 재미 없습니다.

Options.format: "dd:hh:mm:ss" 
> Actually have '119:01:16:18' (for example) 

그래서 루핑 할 때 모든 색인이 하나씩 꺼져 있습니다. 그러나 시간이 <100 일이되면, 그것은 옳을 것이라고 생각합니다. 내 말은 (그래서 당신이 수정 프로그램을 시작하는 장소가있을 수 있습니다) 무엇을 볼 수있는 해키 솔루션으로

이 편집 미리보기 참조 :이 함께 할 수있는 뭔가 내가 생각하고

switch (options.format[i]) { 
     case 'h': 
     digits[c].__max = ((c-1) % 2 == 0) ? 2: 9; // <== EDIT 
     if (c % 2 == 0) 
      digits[c].__condmax = 4; 
     break; 
     case 'd': 
     digits[c].__max = 9; 
     break; 
     case 'm': 
     case 's': 
     digits[c].__max = ((c-1) % 2 == 0) ? 5: 9; // <== EDIT 
    } 
+0

그런데 테스트를 위해 간격을 100ms로 설정하면 도움이 될 수 있습니다. 보다 합리적인 시간대에 몇 분씩 순환하십시오. –

+0

코드의 해당 부분이 95 문제를 해결하는 것으로 보입니다. 고마워, 조쉬! : o) jsFiddle에서 업데이트 된 코드. – StealthRT

-1

는 코드가 잘 실행 것으로 보인다. 코드

setInterval(moveStep(digits.length - 1), 1000); 

setInterval() 기능 즉 모든 초, moveStep() 1,000 밀리 초를 호출합니다. 그러나 컴퓨터, 운영 체제 및 브라우저가 밀리 초 단위로 정확할 것으로 기대할 수는 없습니다. 경우에 따라 이벤트가 더 빨리 트리거되고 때로는 나중에 트리거됩니다 (특히 코드를 방해하거나 느려질 수있는 다른 프로그램을 실행하는 경우). 그래서 그냥 대신

counter=2 - 1 second delay - counter=1 - 1 second delay - counter=0 

당신이 그런

counter=2 - 2 second delay - counter=1 - counter=0 

또는 무언가를 얻을 발생할 수 있습니다. 이 경우 counter=1이 표시되지 않습니다. 다음 이벤트가 발생할 때 즉시 다시 그려지고 counter0으로 설정되어 있기 때문입니다. 당신이 할 수있는

한 가지 setInterval 대신 setTimeout을 사용하는 것입니다, 그래서 당신은이 경우

var callback = function() { 
    moveStep(digits.length - 1); 
    setTimeOut(callback, 1000); 
} 

setTimeOut(callback, 1000); 

을 얻을의 시간 제한 이벤트는 큐에 일치하지 않습니다 그리고 그들은처럼, 한 번에 트리거 이전의 경우에서 그렇습니다. 이는 간격을 설정하지 않고 시간 제한 만 설정했기 때문입니다. 현재 이벤트가 완료된 후 1 초 후에 다음 이벤트가 발생하도록 예약됩니다. 이 방법으로 두 이벤트 사이의 시간은 항상 (대략) 1 초가됩니다.

그러나 여기의 문제는 세계와 대략입니다. 첫 번째 경우 setInterval()은 이벤트가 1 초, 2 초, 3 초 등으로 발생하도록 예약하므로 x 초 후에 카운터가 x만큼 줄어야합니다 (모든 단계에서 때때로 다시 그리지는 않음). 그러나 두 번째 경우에 setTimeout을 사용하면 1000 밀리 초에서 약간의 편차가 천천히 축적 될 수 있으므로 초 후에 카운터가 x*1.1만큼 감소합니다. 즉, 제 시간에 도착한다고 보장 할 수는 없습니다.

요약하면 setInterval과 관련된 일반적인 문제에 직면하고 있으며 이에 대해 할 일이별로 없다고 생각합니다.

내가 찾은 문제

가 너무 많은 일이 그래서 당신의 인덱스가 꺼져 가지고 ... 그리고 나는 모든 해답이 확실하지 않다 -

+0

당신이보고보고 있다면, 그것은 모든 시간 - 21 ... 20 ... 15, 11 ... 10 ... 5 등을 볼 수 있습니다. 그것은 타이머 질문이 아니라 코드 질문입니다. 이 사건은 루핑하는 동안 인덱싱과 관련이 있고 숫자 당 최대 값을 설정합니다. –

관련 문제