Мне нужно передавать положение касания в Chrome для Android постоянно на сервер Node.js
с помощью Socket.io
. Однако, я думаю, передача слишком быстрая. Первые несколько значений получает сервер (За первое касание около шести значений, позже только два-три значения), потом вроде пробка. В течение многих секунд сервер ничего не получает. Затем внезапно все пропущенные значения внезапно поступают на сервер. Но не непрерывно...
Я думаю, что должен уменьшить трафик от клиента к серверу, позволив клиенту излучать только с интервалом в 500 мс. В этом видео демонстрируется последний из следующих вариантов.
Что я пробовал до сих пор (без успеха):
Обертывание функции setInterval вокруг функции emit в клиентском коде:
setInterval( function(){ Socket.emit( 'position', posX ) }, 500);
Регулировка эмиссии с помощью
Date.now()
в клиентском коде:var timestamp = 0; // ... if (Date.now() - timestamp >= 500) { Socket.emit( 'position', posX ); timestamp = Date.now(); }
Регулирование события
touchmove
в клиентском коде с помощью библиотекиunderscore
$('#canvas').on("touchmove", _.throttle(function (ev) { var e = ev.originalEvent; var posX = logCounter + " : " + e.targetTouches[0].pageX; $('#div').text(posX); socket.emit('position', posX); logCounter++; return false; }, 500));
Позвольте мне отметить, что этот фрагмент регистрирует
posX
как HTMLdiv
на веб-странице И в консоли сервера. Браузер логирует каждые 500мс как положено, но сервер (черезSocket.io
) логирует только в начале как положено, потом перерыв, потом все пропущенные значения сразу.
Проект находится на Github.
Любые идеи, как реализовать плавную (непрерывную) передачу?
Изменить:
Я выяснил, что эта проблема существует только с браузером Chrome на моем телефоне Android и на планшете Android. Это приложение отлично работает с Firefox для Android, Opera для Android и Safari для iOS.
Как я могу перехитрить Chrome?
ev.preventDefault()
не совместим с функциейthrottle
, поэтому вместо этого я используюreturn false
. - person wurstbrotrest   schedule 20.12.2015