Причина:
Предположим, у вас есть приложение ajax, которому необходимо выполнить полдюжины HTTP-запросов для загрузки различных данных с сервера, прежде чем пользователь сможет выполнить какое-либо взаимодействие.
Очевидно, вы хотите, чтобы это запускалось при загрузке.
Для этого очень хорошо работают синхронные вызовы, не усложняя код. Это просто и понятно.
Недостаток:
Единственный недостаток заключается в том, что ваш браузер блокируется до тех пор, пока не будут загружены все данные или не истечет время ожидания. Что касается рассматриваемого приложения ajax, это не большая проблема, потому что приложение бесполезно, пока все исходные данные не будут загружены.
Альтернатива?
Однако многие браузеры блокируют все окна / вкладки, когда javascript занят в любом из них, что является глупой проблемой дизайна браузера, но в результате блокировка, возможно, медленной сети, становится не вежливой, если она не позволяет пользователям использовать другие вкладки ожидая загрузки страницы ajax.
Однако похоже, что синхронное получение было удалено или ограничено в последних браузерах. Я не уверен, что это потому, что кто-то решил, что они всегда были плохими, или разработчики браузеров были сбиты с толку рабочим проектом WC по этой теме.
http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117/#the-open-method делает вид, что (см. раздел 4.7.3) вам не разрешено устанавливать тайм-аут при использовании режима блокировки . Мне кажется, счетчик интуитивно понятен: всякий раз, когда кто-то блокирует ввод-вывод, вежливо установить разумный тайм-аут, так зачем разрешать блокировку io, но не с указанным пользователем таймаутом?
Я считаю, что блокировка ввода-вывода играет жизненно важную роль в некоторых ситуациях, но должна быть реализована правильно. Хотя для одной вкладки или окна браузера недопустимо блокировать все остальные вкладки или окна, это недостаток дизайна браузера. Позор там, где стыд. Но в некоторых случаях вполне допустимо, чтобы отдельная вкладка или окно не реагировали в течение нескольких секунд (например, с использованием блокировки ввода-вывода / HTTP GET) в некоторых ситуациях - например, при загрузке страницы, возможно, много данных должно быть, прежде чем что-либо можно будет сделать. Иногда правильно реализованный блокирующий код - самый чистый способ сделать это.
Конечно, эквивалентная функция в этом случае может быть получена с использованием асинхронных HTTP-запросов, но какая глупая процедура требуется?
Думаю, я бы попробовал что-нибудь в этом роде:
При загрузке документа выполните следующие действия: 1: Установите 6 глобальных переменных флага «Готово», инициализированных в 0. 2: Выполните все 6 фоновых запросов (при условии, что порядок не имеет значения)
Затем обратные вызовы завершения для каждого из 6 HTTP-запросов установят соответствующие флаги «Готово». Кроме того, каждый обратный вызов будет проверять все остальные флаги выполнения, чтобы узнать, завершены ли все 6 HTTP-запросов. Последний завершенный обратный вызов, увидев, что все остальные завершились, затем вызовет функцию REAL init, которая затем все настроит, теперь, когда все данные были получены.
Если порядок выборки имеет значение или если веб-сервер не может принимать несколько запросов одновременно, вам понадобится что-то вроде этого:
В onload () будет запущено первое получение http. В этом обратном вызове будет запущен второй. В этом обратном вызове третий - и так далее, и так далее, причем каждый обратный вызов запускает следующий HTTP GET. Когда вернется последний, он вызовет настоящую процедуру init ().