Несомненно, все знают, что js — это однопоточный язык, а это значит, что JS не может выполнять многопоточность, но асинхронная функция в JS может полностью имитировать многопоточность, и эффект тоже отличный. Конечно, если вы хотите полностью понять асинхронность, вы должны сначала понять ядро JS — цикл событий (Event Loop).Следующие две части, чтобы понять цикл событий:
Первый: Цикл событий в браузере
- Чтобы лучше понять очередь задач и цикл обработки событий JS в браузере, см. следующий рисунок:
- eventLoop реализуется хост-средой JS (браузером);
- Цикл событий можно просто описать следующими четырьмя шагами:
1. 函数入栈,当Stack中执行到异步任务的时候,就将他丢给WebAPIs,接着执行同步任务,直到Stack为空;
2. 此期间WebAPIs完成这个事件,把回调函数放入队列中等待执行(微任务放到微任务队列,宏任务放到宏任务队列)
3. 执行栈为空时,Event Loop把微任务队列执行清空;
4. 微任务队列清空后,进入宏任务队列,取队列的第一项任务放入Stack(栈)中执行,回到第1步。
- Распознать источник задачи (задачу) в браузере:
- Микро задачи: потом, канал сообщения, мутацияОберсве
- Задачи макросов: setTimeout, setInterval, setTmmediate (совместимы только с ie)
- Вот небольшой пример:
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
Два: Цикл событий в среде узла
- Чтобы лучше понять очередь задач и цикл обработки событий JS в среде Node, см. следующий рисунок:
-
Хотя картина немного запутана, нам нужно позаботиться только об этапе таймера таймера, этапе опроса, этапе проверки проверки, этапе закрытия клонов и очереди микрозадач.
-
В среде Node микрозадачи выполняются путем вставки швов (если при выполнении макрозадач обнаруживаются микрозадачи, Не будет выполняться как браузер, а поставит микрозадачи в очередь микрозадач и будет ждать весь макрос После того, как очередь задач будет выполнена или достигнет строки выполнения, она будет выполнена первой при запуске следующего этапа. завершать задачи в очереди микрозадач).
- Знайте источник задачи (задачу) в узле:
- Микрозадачи: then, nextTick, messageChannel,mutationObersve
- Задачи макросов: setTimeout, setInterval, setImmediate, файловые операции io
- Пример 1: Первое выполнение тайм-аута и немедленного не обязательно зависит от времени выполнения узла.
setTimeout(function () {
console.log('setTimeout1');
})
setImmediate(function () {
console.log('setImmediate2');
});
Существует два типа результатов печати:
- 1) setTimeout1 setImmediate2
- 2) setImmediate2 setTimeout1
- Пример 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');
});
});
результат последовательности печати
- происходить , отклониться, тайм-аут
- Пример 3: NextTick будет выполнен до того, как затем в микрозазке.
Promise.resolve().then(function () {
console.log('then2'):
});
process.nextTick(function () {
console.log('nextTick1');
});
результат последовательности печати
- nextTick1 then2
- Пример 4: Микрозадачи будут преимущественно выполняться с файловыми операциями i\o.
let fs = require('fs');
fs.readFile('./1/log',function(){
console.log('fs')
})
process.nextTick(function(){
console.log('text2');
})
распечатать результат выполнения
- text2 fs
Хорошо, на сегодня все, если есть какие-то ошибки, пожалуйста, оставьте сообщение ниже. Как фермер, мое самое большое желание и самый большой идеал - видеть Дабао каждый день, жуки никогда больше не увидят друг друга, забудут друг друга в реках и озерах, и обиды исчезнут! ! !