Почему происходит такое с WebSocket?

Всем привет, пользуюсь Websocket и встал вопрос важный:

Вот у меня есть например таймер, который отсылает данные всем юзерам, но суть в том, что почему то у клиента на котором была нажата кнопка таймер работает корректно, с миллесекундами, а у других через секунду, тоесть вот console.log того что приходит с сервера у юзера который запустил таймер:
616b36563bd93061504728.png

Вот у юезара который подключился:
616b36aae1d74149308445.png

Суть в том что у юзеров которые подключились почему-то пролетают миллисекунды, и показывает не "9.9, 9.8, 9.7", а "9.9, 8.9, 7.9".

$(".btn").click(function(e) {
    initTick = now();
    setTimeout(tick, 20);
});

var ws = new WebSocket("ws://localhost:2346");

function now() {
    return window.performance ? window.performance.now() : Date.now();
}

var count = 30000;
var delay = 20; //20 ms. This will be only indicative. There's no guarantee the browswer will call the function after exactly this time

var initTick = 0;
var timerElement = $(".timer");

function tick() {
    var remaining = (count - (now() - initTick)) / 1000;
    remaining = remaining >= 0 ? remaining : 0;
    var secs = remaining.toFixed(1);
    var data = {
        time: secs,
    };
    ws.send(JSON.stringify(data));
    if (remaining) {
        setTimeout(tick, delay);
    }
}

ws.onmessage = (response) => {
    var data = JSON.parse(response.data);
    $(".timer").html(data.time);
    console.log(data);
};

<?

require_once __DIR__ . '/../vendor/autoload.php';

use Workerman\Worker;

$wsWorker = new Worker('websocket://0.0.0.0:2346');
$wsWorker->count = 1;

$wsWorker->onMessage = function ($connection, $data) use ($wsWorker) {
    foreach ($wsWorker->connections as $clientConnection) {
        $clientConnection->send($data);
    }
};

Worker::runAll();
  • Вопрос задан
  • 871 просмотр
Решения вопроса 2
SagePtr
@SagePtr
Еда - это святое
Когда вкладка теряет фокус, браузер замедляет таймеры - срабатывают они не чаще раза в секунду. Это сделано для экономии ресурсов, негоже фоновым вкладкам вычислительное время забирать.
Ответ написан
@rPman
Можно ли как-то это поправить? Или есть альтернатива может?

WebWorker должен работать не зависимо от того, активная вкладка или нет
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы