Когда запускается цикл событий браузера?


Я использую фреймворк, который включает автоматическое подключение к серверу при загрузке страницы. Я могу отключить его, передавая аргументы options, но строка, которая меня смущает, это this:

Вы можете предотвратить автоматическое подключение этого начального сокета, отключив io.sails.autoConnect до истечения первого цикла цикла событий.

Мои вопросы:

  1. когда истекает первый цикл цикла событий?
  2. является ли это поведение одинаковым для всех современные (IE9+) браузеры?
  3. у меня есть куча скриптов (в ), загружающихся между lib и моим файлом ввода. Влияет ли это на то, когда проходит первый цикл? EDIT: Да, это так.
  4. Как я могу гарантировать, что мой код будет запущен до истечения первого цикла?
  5. считается ли такой вид реализации auto-connect хорошей практикой?
1 7

1 ответ:

Документация для исходного файла немного более ясна; в ней говорится: "Это можно отключить или настроить, установив io.socket.options в первом цикле цикла событий."

В основном происходит то, что в библиотеке существует вызов setTimeout(fn, 0), который является идиоматическим для запуска параллельного процесса. Однако в стандартах JS явно указано, что JS является однопоточным: другими словами, хотя setTimeout и setInterval являютсяасинхронными , на самом деле они не являются параллельные в том смысле, что любой их код будет выполняться одновременно с любым другим кодом. Поэтому они ждут, пока текущая функция не закончится, прежде чем выполнить ее. Этот механизм массового обслуживания известен как цикл событий JavaScript.

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

Это также вероятно что аналогичный эффект будет достигнут, если поместить тег <script> под тем, который загружает данный JS. Это не было явно стандартизировано HTML 4, но может быть неявно стандартизировано в новой спецификации HTML 5 (это сложное взаимодействие между различными частями спецификаций).

В терминах HTML5 это выглядит так: текущие спецификации говорят , что есть событие afterscriptexecute и событие load, которые происходят сразу после загрузки любого удаленного скрипта (или, если это встроенный скрипт). сценарий, событие load запланировано как задача - я не уверен, когда это произойдет). Таким образом, вы можете гарантировать это без изменения скрипта, сделав вместо этого:

<script>
function do_not_autoload() { /* ... */ }
</script>
<script onload="do_not_autoload()" src="./path/to/sails.io.js"></script>
Но я не уверен, как будет выглядеть таблица совместимости для script@onload.

Я сделал вам jsfiddle, который можно использовать, чтобы захватить "отпечаток пальца" для различных браузеров, чтобы получить представление о том, какие порядки оценки существуют в дикой природе. * - это документ.тело.событие onLoad. На моем система, которую он производит:

Firefox 32.0.3 : cafdbe*
Chrome 37.0.2062 : cafd*be
IE 11.0.9600 : cafd*be

Другими словами,