Как setInterval () работает независимо от последовательного выполнения? - PullRequest
0 голосов
/ 12 февраля 2020

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

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

За кулисами есть очередь «заданий», которые должны запускаться JavaScript (событие l oop). Задачи - это функции. В конце функции JavaScript проверяет очередь, чтобы узнать, должна ли быть вызвана другая функция.

setInterval только помещает функции в эту очередь, которые будут запущены в указанное время.

* У 1011 * есть только 1 поток, поэтому, если тяжелые вычисления занимают много времени, события в очереди будут отложены до тех пор, пока эта задача не будет завершена.

Именно поэтому вы не хотите запускать функцию блокировки в JS.

0 голосов
/ 12 февраля 2020

Хотя каждый JavaScript агент имеет один исполняющий поток - так называемое «событие l oop» - время выполнения не ограничено числом потоков выполнения, которые он может использовать для обслуживания этого.

Обратные вызовы, передаваемые таким функциям, как setInterval, setTimeout или requestAnimationFrame, запланированы для запуска "magi c "(ie. Скрытые логи c) в среде выполнения JavaScript.

Этот скрытый логи c планирует вставку обратных вызовов в очереди заданий в соответствующее время (например, после истечения интервала). Когда задание, связанное с обратным вызовом, достигает передней части соответствующей очереди заданий и когда выполняющий поток доступен для обслуживания, задание удаляется из очереди, кадр стека (он же контекст выполнения ) для него создается экземпляр, помещается в стек вызовов и начинается выполнение.

Лог c для асинхронных функций, таких как setTimeout, setInterval и requestAnimationFrame, определены в других спецификациях (например, W3C / WHATWG ) и реализуется хост-приложениями (например, веб-браузером или экземпляром NodeJS). Эти функции не определены в спецификации ECMAScript.

Асинхронное поведение обещания , с другой стороны, указано в спецификации ECMAScript.

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