2013-07-26 2 views
0

У меня есть объект, который содержит некоторые данные о прогрессии бара, но он продолжает останавливаться на уровне 99% и не будет продолжаться, я верю, потому что время клиента не будет таким же, как время сервера, достаточно точно для этого. Поэтому я не знаю, как его решить.Прогрессивная панель синхронизации javascript к серверному времени?

Эти 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. Затем, спустя одну секунду после вызова функции снова, внешний блок if не будет введен из-за myObj[i].end > now, равный false. Следующий код будет гарантировать, что если время истечет, а myObj[i].percentage - < 100 из-за вышеприведенного сценария, оно будет установлено в 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

Я добавил функцию my Q, чтобы вы могли проверить? – Sir

+0

Да, ошибка основана на 'if (myObj [i] .end> now) {' заставляя ** завершение ** (статус 100%) блока/единицы работы пропускаться в основном. –

Смежные вопросы