Skip to content

Commit

Permalink
minor fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
iliakan committed Apr 6, 2022
1 parent dd0e57e commit db83923
Showing 1 changed file with 42 additions and 24 deletions.
66 changes: 42 additions & 24 deletions 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md
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`.

0 comments on commit db83923

Please sign in to comment.