Когда запускается цикл событий браузера?
Я использую фреймворк, который включает автоматическое подключение к серверу при загрузке страницы. Я могу отключить его, передавая аргументы options, но строка, которая меня смущает, это this:
Вы можете предотвратить автоматическое подключение этого начального сокета, отключив
io.sails.autoConnect
до истечения первого цикла цикла событий.
Мои вопросы:
- когда истекает первый цикл цикла событий?
- является ли это поведение одинаковым для всех современные (IE9+) браузеры?
- у меня есть куча скриптов (в ), загружающихся между lib и моим файлом ввода. Влияет ли это на то, когда проходит первый цикл? EDIT: Да, это так.
- Как я могу гарантировать, что мой код будет запущен до истечения первого цикла?
- считается ли такой вид реализации auto-connect хорошей практикой?
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
Другими словами,