Есть ли способ ограничить количество открытых вызовов AJAX в браузере? - PullRequest
3 голосов
/ 01 апреля 2011

У меня есть вопрос разработки программного обеспечения о том, как лучше всего обрабатывать клиентскую JavaScript-программу, использующую многократные (но в основном последовательные, а не одновременные) кратковременные AJAX-вызовы на сервер в качестве ответадля взаимодействия с пользователем [в моем конкретном случае, это будет приложение facebook-GAE / J, но я считаю, что вопрос относится к любому дизайну клиента (браузера) / сервера].

Сначала я задал этот вопрос: Какова продолжительность жизни вызова ajax? .Основываясь на ответе BalusC ( я рекомендую прочитать его там ), короткий ответ "это зависит от браузера".Итак, сейчас у меня нет реального контроля над тем, что происходит после того, как сервер отправил ответ.

  • Если основное использование для вызова AJAX - это получение данных только один раз с сервера, возможно ли его уничтожить вручную?Будет ли xhr1.abort () делать это?

  • Или, лучший выбор, оставить так?Будет ли закрытие каждого соединения вручную (если возможно) добавлять слишком много накладных расходов на каждый вызов?

  • Можно ли вручную установить ограничение для домена?

  • И последнее (но не менее важное) стоит ли мне действительно беспокоиться об этом ?Какое количество вызовов будет достаточно большим, чтобы начать задерживать браузер (особенно в некоторых браузерах IE с ошибкой утечки, о которой BalusC упоминал в другом вопросе? Пожалуйста, имейте в виду, что это мой первый проект сервлетов javascript / java.

Заранее спасибо

Ответы [ 2 ]

7 голосов
/ 01 апреля 2011

Парадигма использования для XHR заключается в том, что вам не нужно беспокоиться о том, что происходит с объектом - движок браузера позаботится об этом за кадром.Поэтому я не вижу смысла пытаться «улучшить» вещи вручную.Разработчики браузеров, безусловно, знают, что 99,9999% программистов на JS этого не делают, поэтому они не только приняли это во внимание, но и, вероятно, оптимизировали для этого сценария.

Вам не следует беспокоиться об этом, если только выиметь конкретную проблему в ваших руках.

Что касается ограничения количества вызовов AJAX на домен (либо одновременных невыполненных вызовов, либо общего числа совершенных вызовов, либо любого другого показателя, который вас может заинтересовать), решением будетпочтенная классика CS: добавьте еще один уровень абстракции.

В этом случае дополнительный уровень абстракции будет функцией, через которую будут проходить все вызовы AJAX;Затем вы можете реализовать логику, которая отслеживает ход каждого вызова (для каждого домена, если вы этого хотите) и отклоняет или откладывает входящие вызовы на основе этого состояния.Это будет нелегко получить правильно, но это, безусловно, выполнимо.

Тем не менее, я предлагаю также не беспокоиться о этом до тех пор, пока у вас не возникнет конкретная проблема.:)

Обновление:

Браузеры применяют собственные ограничения для одновременных вызовов AJAX;здесь есть очень хороший вопрос: Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

Кроме того, как упоминает TJ Crowder в комментариях: убедитесь, что вы несохраняя ссылки на объекты XHR, когда вы закончите с ними, чтобы их можно было собирать мусором - в противном случае вы создаете утечку ресурсов самостоятельно.

Второе обновление:

В блоге есть хорошая статья о повторном использовании XHR здесь - это фактически начало цепочки соответствующих сообщений.С другой стороны, он датирован и не приводит к практическим выводам.Но он хорошо описывает механизм повторного использования XHR.

4 голосов
/ 01 апреля 2011

Если основное использование вызова AJAX - это получение данных с сервера только один раз, возможно ли его уничтожить вручную?Будет ли xhr1.abort () делать это?

Это только отменяет запущенный запрос.Это не закрывает соединение.

Или, лучший выбор, оставить так?Будет ли закрытие каждого соединения вручную (если возможно) добавлять слишком много накладных расходов на каждый вызов?

Невозможно.Это обязанность браузера.

Можно ли вручную установить ограничение для домена?

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

И последнее (но не менее важное), должен ли я действительно беспокоиться об этом?Какое количество вызовов будет достаточно большим, чтобы начать задерживать браузер (особенно в некоторых браузерах IE с ошибкой утечки, о которой BalusC упоминал в другом вопросе? Пожалуйста, имейте в виду, что это мой первый проект сервлетов javascript / java.

Да, вам, безусловно, следует беспокоиться об ошибках, специфичных для браузера. Вы хотите, чтобы ваше приложение работало без проблем?все неприятные ошибки и детали под крышками для вас (что намного больше, чем утечка памяти MSIE). Просто позвоните $.ajax(), $.get(), $.post() или $.getJSON() и все. Я не буду пытаться изобретать колесо обработки XHR, когда вы довольно новичок в материалах. Некоторые примеры взаимодействия с jQuery-Servlet можно найти в этот ответ .

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