#javascript #jquery #comet #long-polling
#javascript #jquery #comet #длительный опрос
Вопрос:
У меня есть свой собственный урезанный скрипт, который в настоящее время использует теги XHR или script в зависимости от поддержки браузера. Эти запросы в конечном итоге возвращают некоторый JSON. Моя проблема в том, что теперь элементы этого объекта теперь должны обновляться сервером во время работы на клиенте, т. Е. мне нужно реализовать что-то вроде long pull / comet soln.
Google, похоже, придумал множество soln, использующих различные фреймворки, такие как jQuery и т.д., Чтобы сделать это на стороне клиента. Однако это не вариант для меня.
Мне было интересно, есть ли у вас, ребята, какие-либо предложения о том, как я мог бы расширить свой существующий подход, чтобы разрешить обновления стиля comet с сервера. Один из стандартных подходов, похоже, использует скрытые фреймы iframes. Это бесполезно, поскольку сервер приложений, который предоставляет мне мои данные json, отличается от реального веб-сервера.
Ответ №1:
jQuery просто обтекает объект XHR / XMLHttpRequest. Прежде всего, вам нужна небольшая функция для возврата объекта кроссбраузерным способом. Это делается в 3 строки или меньше, не слишком сложно. Тем не менее, это отличные фрагменты для исправления различных проблем браузера, таких как утечки памяти. Я настоятельно рекомендую вам использовать этот. Они, конечно, занимают более 3 строк (если не уменьшены). Но в любом случае, если вам нужны повторные подключения, вы просто не сможете сделать это с нуля.
Далее, на стороне сервера, предполагая, что вы используете PHP:
set_time_limit(300); // force connection only after 5 minutes
ignore_user_abort(false); // if the connection ends, terminate immediately
while(true){
if(some_condition()){
echo some_response();
break; // break the loop
}
sleep(2); // wait for a second or two
}
На стороне клиента просто повторяйте запрос всякий раз, когда заканчивается соединение. На этом этапе также обработайте выходные данные.
Пример на стороне клиента:
function poll(){
jQuery.get('http://somesite.com/poll.php',function(data){
alert('Just received: ' data);
poll(); // repeat poll
});
}
poll(); // begin polling
Комментарии:
1. Кристиан, можешь немного рассказать о том, как я бы реализовал то, что ты говоришь, на стороне клиента.
2. Смотрите мой пересмотренный код. Хотя в jQuery должно быть легко преобразовать в обычный javascript.