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

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 и выполняется.

Вот и все, я надеюсь, вы поняли концепцию.