Как сделать динамическое обновление контекта, запрашиваемого через JSON?
Постановка: JSON'ом передается информация с сервера, необходимо сделать динамическое обновление этой информации при изменении файла на сервере.
Решил с помощью setTimeout и рекурсии функции, которая делает getJSON. Но, мне кажется, есть какое-то другое, более правильное/удобное решение. Это решение, во-первых, делает большую нагрузку на сервер, во-вторых, по прошествия некоторого времени, почему-то перестает обновлять данные.
Интересует как осуществить это правильней? И как похожие вещи сделаны в том же ВКонтакте (получение сообщений, комментарии), GMail и так далее?
Вконтакте используется какая-то бибилиотека для веб-сокетов, а на серверах наверно стоит сишный (или не сишный?) демон, специально написанный для этой цели. Если сможете повторить такую конструкцию, будем рады видеть вашу статью с описанием на Хабре.
> Ошибка в использовании setTimeout вместо setInterval.
В идеале лучше делать следующий запрос после предыдущего. Тогда можно отловить, ответил ли сервер, и вывести уведомления, что либо сервер не отвечает, либо инет пропал.
Если интересует, как это сделано на других, поковыряйте сами глубже.
Например, просто, через тот же firebug (вкладка Net) вы увидите, опрашивают
ли сами клиенты сервер.
Если нет, — значит где-то на клиенте открыт слушающий сокет, куда может
обращаться сервер.
setTimeout валится из-за необработанной ошибки.
Использовать setInterval тоже нужно осторожно, была реальная ситуация, когда при неактивной вкладке браузера setInterval начинал накапливаться (т.е. не выполнялся, а складывался в какую-то очередь), а потом при открытие вкладки выполнял все, что накопилось.
Комета — тоже нужно хорошо подумать, т.к. это постоянное подключение к серверу и дополнительные скрипты на сервер-сайде. Использовать его нужно только там, где она оправдано (да и без setTimeout все-равно не обойдетесь).
Нагрузка на сервер, случившаяся у вас, могла произойти по двум причинам — не очевидная ошибка в сервер-сайде (скорее всего связанная с утечками памяти) или тупо слишком короткий интервал обновления (выстраивается очередь http-запросов).
Напрашивается websockets, но с ним пока много «но»…