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