2013-07-26 2 views
0

막대의 진행에 대한 데이터가 포함 된 개체가 있지만 99 %에서 멈추지 않고 계속 진행되지는 않습니다. 왜냐하면 클라이언트 시간이 서버 시간과 정확하게 일치하지 않기 때문입니다. 그래서 그것을 해결하는 방법을 모르겠습니다.진행률 막대가 서버 시간에 자바 스크립트를 동기화합니까?

이 2 개의 타이머는 서버 측에서 생성되어 클라이언트로 전송됩니다.

myOjb[i].end: 1374805587 //seconds since epoch for when 100% is made 
myObj[i].strt: 1374805527 //seconds since epoch when it started 

비율 산출 된 함수 : 타이밍이보다 정확하므로

function clocker() { 
    var now = new Date().getTime()/1000; 
    for (var i in myObj) { 
     if (myObj[i].end > now) { 
      var remain = myObj[i].end - now; 
      var per = (now - myObj[i].strt)/(myObj[i].end - myBuildings[i].strt) * 100; 
      var per = fix_percentage(per); // stops > 100 and < 0 returns int if true 

      myObj[i].percentage = Math.ceil(per); 

      console.log(myObj[i].percentage); //reaches 99 max 

      if (myObj[i].percentage > 99) { 
       console.log('test'); //never occurs 
       return false; 
      } 
      break; 
     } else { 
      continue; 
     } 
    } 
    setTimeout(clocker, 1000); 
} 

function fix_percentage(per){ 
    if(per>100)per=100; 
    if(per<0)per = 0; 

    return Math.round(per); 
} 

가 어떻게 두 개의 서로 동기화 할 수 있습니까?

답변

1

편집 : 원래의 대답은 잘못된 가정을 기반으로했습니다. 무슨 일이 일어나고있는 것은 본질적으로 백분율을 100으로 설정하는 블록이 건너 뛸 수 있다는 것입니다. 이는 하나의 반복에서 per의 값이 < 99.5이지만> 88.5 인 경우에 발생합니다. 이 경우 반올림 된 per의 값은 99입니다. 그런 다음 1 초 후에 함수가 다시 호출되면 myObj[i].end > nowfalse이므로 외부 if 블록이 입력되지 않습니다. 다음 코드는 위의 시나리오로 인해 시간이 만료되고 myObj[i].percentage이 < 인 경우 100으로 설정되고 블록이 다른 경우처럼 반환합니다.

if (myObj[i].end > now) { 
     var remain = myObj[i].end - now; 
     var per = (now - myObj[i].strt)/(myObj[i].end - myBuildings[i].strt) * 100; 
     var per = fix_percentage(per); // stops > 100 and < 0 returns int if true 

     myObj[i].percentage = Math.ceil(per); 

     console.log(myObj[i].percentage); //reaches 99 max 

     if (myObj[i].percentage > 99) { 
      console.log('test'); //never occurs 
      return false; 
     } 
     break; 
    } else if ((now >= myObj[i].end) && (myObj[i].percentage < 100)) { 
     console.log('Time expired, but percentage not set to 100') 
     myObj[i].percentage = 100; 
     return false; 
    } else { 
     continue; 
    } 
+0

물론이 전체 대답은 fix_percentage의 동작에 대한 가정을 기반으로합니다. –

+0

확인할 수 있도록 내 Q 기능을 추가 했습니까? – Sir

+0

예, 블록/작업 단위의 ** 완료 ** (100 % 상태)를 유발하는'if (myObj [i] .end>) {{}}를 기반으로 오류가 대부분 건너 뜁니다. –

관련 문제