forked from javascript-tutorial/ru.javascript.info
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
42 additions
and
24 deletions.
There are no files selected for viewing
66 changes: 42 additions & 24 deletions
66
2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,50 @@ | ||
Вывод в консоли: | ||
1 | ||
7 | ||
3 | ||
5 | ||
2 | ||
6 | ||
4 | ||
Вывод в консоли: 1 7 3 5 2 6 4. | ||
|
||
Давайте разберем что здесь происходит. | ||
Задача довольно простая, нужно лишь понимать, как работают очереди микрозадач и макрозадач. | ||
|
||
Сразу исполняются функции стоящие в стеке первой макрозадачи - главного скрипта. | ||
Вывод в консоль: "1" . | ||
Давайте разберем, что здесь происходит, по шагам. | ||
|
||
В второй строке `setTimeout`, который ставит переданный колбэк в очередь макрозадач (macrotask queue) на выполнение.("2") | ||
Далее происходит аналогичная операция в шестой строке.("6") | ||
```js | ||
console.log(1); | ||
// Первая строка выполняется сразу и выводит `1`. | ||
// Очереди микрозадач и макрозадач на данный момент пусты. | ||
|
||
Вывод в консоль: "7". | ||
Конец первой макрозадачи. | ||
setTimeout(() => console.log(2)); | ||
// `setTimeout` ставит переданный колбэк в очередь макрозадач | ||
// - содержимое очереди макрозадач: | ||
// `console.log(2)` | ||
|
||
Переходим в область микрозадач, происходит выполнение всех микрозадач: | ||
1. Вывод в консоль: "3". | ||
2. Создаётся макрозадача setTimeout, которая ставится в очередь уже имеющеёся макрозадачи.("4") | ||
3. Вывод в консоль: "5". | ||
Стек микрозадач пуст. | ||
Promise.resolve().then(() => console.log(3)); | ||
// В очередь микрозадач ставится колбэк, выводящий `3` | ||
// - содержимое очереди микрозадач: | ||
// `console.log(3)` | ||
|
||
Продолжается выполнение кода из очереди макрозадач: | ||
Вывод в консоль: "2". | ||
Вывод в консоль: "6". | ||
Вывод в консоль: "4". | ||
Promise.resolve().then(() => setTimeout(() => console.log(4))); | ||
// В очередь микрозадач ставится колбэк с `setTimeout` | ||
// - содержимое очереди микрозадач: | ||
// `console.log(3); setTimeout(...4)` | ||
|
||
Promise.resolve().then(() => console.log(5)); | ||
// В очередь микрозадач ставится колбэк, выводящий `5` | ||
// - содержимое очереди микрозадач: | ||
// `console.log(3); setTimeout(...4); console.log(5)` | ||
|
||
setTimeout(() => console.log(6)); | ||
// `setTimeout` ставит переданный колбэк в очередь макрозадач | ||
// - содержимое очереди макрозадач: | ||
// `console.log(2); console.log(6)` | ||
|
||
console.log(7); | ||
// Тут же выводит `7`. | ||
``` | ||
|
||
Итак, получается, что: | ||
|
||
1. Числа `1` и `7` выводятся сразу же, так как они не используют очереди задач вообще. | ||
2. Далее после окончания основного потока кода срабатывает очередь микрозадач. | ||
- Её содержимое: `console.log(3); setTimeout(...4); console.log(5)`. | ||
- Выведется `3` и `5`, а `setTimeout(() => console.log(4))` поставит в конец очереди макрозадач вывод `4`. | ||
- В очереди макрозадач получается теперь: `console.log(2); console.log(6); console.log(4)`. | ||
3. Очередь микрозадач полностью выполнена, срабатывает очередь макрозадач. Она выведет `2`, `6`, `4`. | ||
|
||
Получается вывод `1 7 3 5 2 6 4`. |