EventLoop

Node.js внешний интерфейс JavaScript

            EventLoop

Несомненно, все знают, что js — это однопоточный язык, а это значит, что JS не может выполнять многопоточность, но асинхронная функция в JS может полностью имитировать многопоточность, и эффект тоже отличный. Конечно, если вы хотите полностью понять асинхронность, вы должны сначала понять ядро ​​JS — цикл событий (Event Loop).Следующие две части, чтобы понять цикл событий:

Первый: Цикл событий в браузере

  1. Чтобы лучше понять очередь задач и цикл обработки событий JS в браузере, см. следующий рисунок:

  • eventLoop реализуется хост-средой JS (браузером);
  • Цикл событий можно просто описать следующими четырьмя шагами:

1. 函数入栈,当Stack中执行到异步任务的时候,就将他丢给WebAPIs,接着执行同步任务,直到Stack为空;
2. 此期间WebAPIs完成这个事件,把回调函数放入队列中等待执行(微任务放到微任务队列,宏任务放到宏任务队列)
3. 执行栈为空时,Event Loop把微任务队列执行清空;
4. 微任务队列清空后,进入宏任务队列,取队列的第一项任务放入Stack(栈)中执行,回到第1步。

  1. Распознать источник задачи (задачу) в браузере:
  • Микро задачи: потом, канал сообщения, мутацияОберсве
  • Задачи макросов: setTimeout, setInterval, setTmmediate (совместимы только с ie)
  1. Вот небольшой пример:

console.log(1);
console.log(2);
setTimeout(function () {
  console.log('setTimeout1');
  Promise.resolve().then(function () {
    console.log('promise');
  });
});
setTimeout(function () {
  console.log('setTimeout2');
});

распечатать результат:

1
2
setTimeout1

promise

setTimeout2

Два: Цикл событий в среде узла

  1. Чтобы лучше понять очередь задач и цикл обработки событий JS в среде Node, см. следующий рисунок:

  • Хотя картина немного запутана, нам нужно позаботиться только об этапе таймера таймера, этапе опроса, этапе проверки проверки, этапе закрытия клонов и очереди микрозадач.

  • В среде Node микрозадачи выполняются путем вставки швов (если при выполнении макрозадач обнаруживаются микрозадачи, Не будет выполняться как браузер, а поставит микрозадачи в очередь микрозадач и будет ждать весь макрос После того, как очередь задач будет выполнена или достигнет строки выполнения, она будет выполнена первой при запуске следующего этапа. завершать задачи в очереди микрозадач).

  1. Знайте источник задачи (задачу) в узле:
  • Микрозадачи: then, nextTick, messageChannel,mutationObersve
  • Задачи макросов: setTimeout, setInterval, setImmediate, файловые операции io
  1. Пример 1: Первое выполнение тайм-аута и немедленного не обязательно зависит от времени выполнения узла.
setTimeout(function () {
    console.log('setTimeout1');
})
setImmediate(function () {
    console.log('setImmediate2');
});
Существует два типа результатов печати:
  • 1) setTimeout1 setImmediate2
  • 2) setImmediate2 setTimeout1
  1. Пример 2: Если setImmediate выполняется после операции с файлом ввода-вывода, поскольку setImmediate выполняется на этапе после операции с файлом ввода-вывода, после выполнения setImmediate setTimeout будет выполняться на следующем этапе (этап выполнения таймера таймера)
let fs = require('fs');
fs.readFile('1.log', function () {
  console.log('fs');
  setTimeout(function () {
    console.log('timeout');
  });
  setImmediate(function () {
    console.log('mmiediate');
  });
});

результат последовательности печати
  • происходить , отклониться, тайм-аут
  1. Пример 3: NextTick будет выполнен до того, как затем в микрозазке.

Promise.resolve().then(function () {
  console.log('then2'):
});
process.nextTick(function () {
  console.log('nextTick1');
});


результат последовательности печати
  • nextTick1 then2
  1. Пример 4: Микрозадачи будут преимущественно выполняться с файловыми операциями i\o.
let fs = require('fs');
fs.readFile('./1/log',function(){
    console.log('fs')
})
process.nextTick(function(){
    console.log('text2');
})

распечатать результат выполнения
  • text2 fs

Хорошо, на сегодня все, если есть какие-то ошибки, пожалуйста, оставьте сообщение ниже. Как фермер, мое самое большое желание и самый большой идеал - видеть Дабао каждый день, жуки никогда больше не увидят друг друга, забудут друг друга в реках и озерах, и обиды исчезнут! ! !