Вероломство
Весь код примерный максимально приближенный
Есть такой вот реген на php
PHP:
public function regenerateParameter($prop) { // Если текущее значение меньше макисмального, то if ($this->{$prop} < $this->{$prop . ‘_max’}) { // разницу СЕКУНД текщего времени и времени последнего апдейта умножаем на размер регена // для примера $this->{$prop . ‘_reg’} равно 0.1, то есть единица регена каждые 10 секунд // в MySQL тип столбцов decimal с возможностью хранить СОТЫЕ для точности хранения чтобы ничего не потерять округлениями } if ($this->{$prop} > $this->{$prop . ‘_max’}) { $this->{$prop} = $this->{$prop . ‘_max’}; } } // применяем $this->user->regenerateParameter(‘hp’); $this->user->regenerateParameter(‘mp’); $this->user->regenerateParameter(‘hit’); $this->user->save();кидаем где-то $user в вид и выводим там, например $user->hp
Все эти данные формируются дополнительно в json
PHP:
public function regenerateParameterAction() { $json = []; $json[‘hp_max’] = $this->user->hp_max; $json[‘hp_reg’] = $this->user->hp_reg; $json[‘hp’] = $this->user->hp; $json[‘mp_max’] = $this->user->mp_max; $json[‘mp_reg’] = $this->user->mp_reg; $json[‘mp’] = $this->user->mp; $json[‘hit_max’] = $this->user->hit_max; $json[‘hit_reg’] = $this->user->hit_reg; $json[‘hit’] = $this->user->hit; }этот json забирает js и осуществляет анимацию
js
Код (Javascript):
$(function () { $.getJSON(‘/json/regenerate-parameter’, function (json) { let timer = []; $.each([‘hp’, ‘mp’, ‘hit’], function (index, element) { if (parseInt(json[element]) < parseInt(json[element + ‘_max’])) { let now = parseFloat(json[element]); timer[index] = setInterval(function () { now += parseFloat(json[element + ‘_reg’]); if (parseInt(now) === parseInt(json[element + ‘_max’])) { clearInterval(timer[index]); } $(«https://php.ru/forum/threads/pochemu-cherez-dlitelnye-promezhutki-vremeni-intervaly-php-i-js-ne-sovpadajut.91209/#» + element).html(parseInt(now)); }, 1000); // <- СЕКУНДА ЧЁРТ ПОБЕРИ } }); }) });Что происходит?
Проходит 10 секунд, анимация показывает +1, обновляем страницу — PHP выводит те же данные, соответствие полное.
Проходит 55 секунд, анимация показывает +5, обновляем страницу — PHP выводит те же данные, соответствие полное, через 5 секунд (так как до следующего +1 осталось 5 секунд) анимация показывает ещё +1, обновляем страницу — PHP выводит те же данные, соответствие полное.
Если было hp — 10, подождать пока анимацией набежит 50-60 и обновить страницу, то всё нормально: js и php работают в синхроне, данные одинаковые как и в описании выше.
Если было hp — 10, подождать пока анимацией набежит 85-90 и обновить страницу, то PHP зафигачивает максимальное значение hp (в данном случае 100), то есть получается, что на php+mysql время полного регена завершилось, а js отстал по каким-то причинам.
С чем это может быть связано и можно ли пофиксить?
twim32
Я бы изменил поведение: каждые 10 секунд отправляем запрос, дожидаемся ответа от сервера. Если ответ положительный, обновляем UI.
Вероломство
не успел я написать, что решено, спасибо, что уделил внимание
короче косяк замечен, когда в другой вкладке браузера у меня шахматы открыты — lichess, если только одна вкладка с проектом, то всё работает отлично
РЕШЕНО
twim32
Бывает
Похожие записи:
- Реализация функции шаблона recursive_replace_copy_if на C ++
- Веб-приложение калькулятора BMR, написанное на HTML / CSS / Vanilla JS
- Реализация нравится / не нравится
- Кэширование, которое сбрасывается при определенных обстоятельствах: Уменьшите код стандартной пластины
- Система анимированного меню — мобильная и десктопная