Прежде всего, мы должны знать, что существует множество парадигм программирования, языки программирования используют одну или несколько для улучшения некоторых функций. парадигма, управляемая событиями, — это способ определить структуру и то, как поток программы должен решаться с использованием событий.
java script использует управляемую событиями парадигму, чтобы быть быстрой и эффективной, например, узел использует один поток, но, используя управляемую событиями, узел может непрерывно выполнять более одной инструкции. и это делает узел более мощным с высокой производительностью.
Но, как это происходит? это то, на чем мы сосредоточимся в этой статье
во-первых, есть некоторые инструкции, которые не требуют получения данных или затрат времени, а другие требуют. вызов обычной функции не требует ожидания, но обещание требует. Этот тип инструкций, которые потребляют время, имеет два типа: макрозадачи (задачи) и микрозадачи (работы).
Примерами макрозадач являются setTimeOut(), setInterval() и т. д. Промисы и процессы — это микрозадачи.
Теперь нам нужно знать термин, называемый циклом событий, и это программа, отвечающая за организацию и определение того, какая и когда инструкция может выполняться, также есть два типа очередей: одна называется очередью задач (макрос-задача), а другая называется очередь заданий (микрозадачи).
цикл обработки событий сначала выполняет неожидающую инструкцию, помещая ее в стек вызовов, а при обнаружении ожидающей инструкции эта инструкция помещается в очередь задач или очередь заданий в зависимости от ее типа.
давайте возьмем пример, чтобы объяснить, как это действительно работает.
const tom = () => console.log('Tom'); const jerry = () => console.log('Jerry'); const cartoon = () => { console.log('Cartoon'); setTimeout(tom, 5000); new Promise((resolve, reject) => resolve('should it be right after Tom, before Jerry?') ).then(resolve => console.log(resolve)) jerry(); } cartoon();
ожидаемый результат:
Cartoon Jerry should it be right after Tom, before Jerry? Tom
объясним почему?
1-Функция cartoon
попадает в стек вызовов.
2-Он выполняет консольный журнал текста Cartoon. Веб-API setTimeOut
выходит за пределы стека вызовов в следующей строке выполнения, а связанная функция tom
помещается в TaskQueue.
3-В следующей строке выполнения мы сталкиваемся с Promise. Обратный вызов обещания получает место в JobQueue. Следовательно, выполнение консольной функции журнала обещания переходит в JobQueue.
4-В следующей строке выполнения функция jerry
помещается в стек и выполняется.
5-Теперь начинается самое интересное. У нас есть одна запись в TaskQueue и одна в JobQueue. Модель цикла событий отдает приоритет всем заданиям в JobQueue над чем-либо в TaskQueue. Следовательно, обратный вызов обещания сначала попадает в стек вызовов, выполняется, а затем функция tom
попадает в стек вызовов из TaskQueue и выполняется.
Вот и все, я надеюсь, вы поняли концепцию.