Как отобразить «Пользователь печатает ...» для другого пользователя? - PullRequest
2 голосов
/ 25 января 2012

Я занимаюсь разработкой системы обмена сообщениями и хотел бы отображать, когда пользователь печатает или нет.Как я рассчитывал, я бы сделал это, просто имея в своей базе данных таблицу, которая называется «печатать» со столбцами для того, кто печатает, кому они печатают, и время.Каждый раз, когда они нажимают клавишу в поле ввода, я отправляю сообщение в базу данных (похоже, это замедлит работу сайта).Затем я запускаю некоторый javascript, который проверяет, является ли столбец в поле ввода более 5 секунд, если нет, то я отображаю сообщение, если это так, то я удаляю его.

Это выглядит довольнопрямой способ сделать это, но мне было интересно, есть ли лучший вариант.Меня не устраивают такие частые посты в базе данных.Так кто-нибудь знает лучший способ, которым это может быть достигнуто?Любая помощь приветствуется, спасибо.

Ответы [ 4 ]

4 голосов
/ 25 января 2012

Почему бы нам не изменить свое мышление?Возьмите на себя нагрузку на клиента, а не на сервер, для набора.

После нажатия first , отправьте событие на сервер и запустите тайм-аут.Через 5 секунд мы скажем, что больше не печатаем.Если есть еще одно нажатие клавиши, мы стираем старое время ожидания и запускаем новое.Это гарантирует, что каждый раз, когда пользователь печатает последовательно, оно обновляется.

Если ваш пользователь перезагружает страницу или покидает ее, это проблема.Тогда они не печатают, но тайм-аут не сработает.Чтобы справиться с этим, я бы порекомендовал вам сделать две вещи.Во-первых, когда пользователь запрашивает новую страницу, всегда ставьте его статус not-typing.Зачем?потому что, по крайней мере, в этот момент они не набирают текст, даже если открывают новую вкладку.Во-вторых, если пользователь покидает браузер и закрывается до того, как триггер перестал вводить текст, вы, возможно, захотите его почистить.Вероятно, вы могли бы запускать cron каждый час, и любой, кто старше 5 минут, все же говорит, что все еще печатает, но не печатает.

0 голосов
/ 25 января 2012

Кажется, что на что-то очень простое накладные расходы, даже если вы долго опрашиваете (надеюсь).Это действительно зависит от серверной системы, подключающейся к SQL.Рассматривали ли вы использовать веб-сокет для этого?Это настоящая полнодуплексная связь.

0 голосов
/ 25 января 2012

вы можете перенести состояние ввода в нечто вроде memcache или redis, так как не имеет значения, потеряете ли вы состояние ввода для пользователя. и так как вам нужно только прочитать значение, чтобы сообщить другим, печатал ли пользователь за последние 5 секунд.

0 голосов
/ 25 января 2012

Каждые пять секунд или около того проверяйте, является ли содержимое ввода текста пустым. Если текст есть, пометьте пользователя набрав.

Единственным недостатком является то, что если оставить сообщение наполовину напечатанным, пользователь будет помечать его как набравшего, пока он либо не закроет окно, не поймет и не вернется, чтобы отправить его, либо очистит его. Но вы можете определить, изменилось ли половинное сообщение или нет, перед отправкой на сервер.

...