Javascript: два подключения на клиента? - PullRequest
3 голосов
/ 12 декабря 2011

Я работаю над приложением, которое реализует longpolling, потому что я хочу, чтобы пользователь получал уведомления, как только они приходят.У меня эта часть работает, но мне также нужно расширить ее с помощью функции javascript, которая отправляет «сердцебиение» на сервер каждые 20 секунд.

Мой вопрос: как мне это сделать, не прерывая полностью код для20 секунд (чтобы другой javascript все еще выполнялся во время подсчета) и есть ли способ использовать второе соединение для этого?Потому что я не хочу, чтобы мой длинный опрос прерывался при отправке пользователю пульса.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 12 марта 2012

Несмотря на то, что приведенная ниже ветка довольно старая, она показывает, что браузеры допускают одновременное подключение нескольких соединений через XMLHttpRequest.

Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

Если у вас длинный сеанс опроса с использованием XMLHttpRequest или любого другого средства реализации кометы, вы все равно можете создать другой запрос к тому же серверу как часть функции setInterval или setTimeout, пока не достигнете конечного пределанавязанное браузером, все, что вам нужно, это включить асинхронный флаг в конструкцию XHR:

var heartbeatXhr = new XMLHttpRequest();
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous
4 голосов
/ 12 марта 2012

Используйте setInterval(yourHearbeatFunction, 20000), он не блокирует поток выполнения Javascript. Таким образом, длиннополочный запрос будет обработан, как только он поступит.

1 голос
/ 17 марта 2012

Вам не нужно поддерживать несколько соединений для того, чего вы пытаетесь достичь. Асинхронная природа Javascript позволяет соединению оставаться в живых, пока другие вещи обрабатываются. Возможно, вы подумали, что XHR в javascript блокировались, потому что он однопоточный.

XHR в javascript являются неблокирующими из-за модели цикла событий - механизмы javascript постоянно находятся в цикле, проверяя, завершены ли зарегистрированные вызовы и должны ли обрабатываться его обратные вызовы. Это позволяет его операциям быть неблокирующими и, таким образом, позволяет одному приложению javascript обрабатывать несколько длинных запросов опроса XHR.

Если вы можете использовать jQuery для запроса, XHR довольно хорошо оборачивает эту функцию: http://api.jquery.com/jQuery.ajax/. Таким образом, вы можете определить тайм-аут в 20 секунд и обработать его немедленно (для повторного запуска соединения). с вашим сервером).

В сторону - вы можете рассмотреть возможность использования стека вашего сервера для оптимизации длинных опросов. Убедитесь, что ваш веб-сервер не создает поток на запрос (например, Apache 2.2) - в противном случае вы быстро исчерпаете системные ресурсы! Если вы можете использовать node.js (который отлично подходит для обработки множества одновременных запросов), посмотрите на библиотеку socket.io как на стороне сервера, так и на стороне клиента (http://socket.io/#home).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...