Skip to content

Commit 424e462

Browse files
committed
Add event loop task
1 parent d5e3050 commit 424e462

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
1. Создание промиса
2+
2. Конец скрипта
3+
3. Обработка промиса
4+
4. Таймаут
5+
6+
Давайте разберем что здесь происходит.
7+
8+
Изначально в стеке выполнения находится сам скрипт, поэтому сначала выполняется только он.
9+
10+
В первой строке появляется `setTimeout`, который ставит переданный колбэк в очередь макрозадач (macrotask queue) на выполнение.
11+
12+
После этого в переменную `p` запишется промис. Стоит отметить, что создание промиса в данном случае происходит синхронно. Это значит, что код из переданного колбэка выполнится прямо сейчас.
13+
В результате в консоль выведется `'Создание промиса'`.
14+
15+
Далее мы уведомляем потребителя `then`, что хотели бы выполнить переданную функцию после успешного выполнения промиса. Так как промис уже имеет состояние `fulfilled` (мы вызвали `resolve()` при его создании), колбэк из `then` будет немедленно передан в очередь микрозадач (microtask queue) на выполнение.
16+
17+
В конце выполнения скрипта выведется `'Конец скрипта'`.
18+
19+
Скрипт является макрозадачей. Как мы уже знаем, после завершения каждой задачи опустошается очередь микрозадач. В ней находится только ранее переданный в `then` колбэк. В результате его выполнения в консоль выведется `'Обработка промиса'`.
20+
21+
Так как очередь микрозадач опустела, можно продолжить выполнять код из очереди макрозадач. Там сейчас находится только колбэк, который мы передавали `setTimeout`. После его выполнения выведется `'Таймаут'`.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
importance: 5
2+
3+
---
4+
5+
# Что код выведет в консоли?
6+
7+
```js
8+
setTimeout(function timeout() {
9+
console.log('Таймаут');
10+
}, 0);
11+
12+
let p = new Promise(function(resolve, reject) {
13+
console.log('Создание промиса');
14+
resolve();
15+
});
16+
17+
p.then(function(){
18+
console.log('Обработка промиса');
19+
});
20+
21+
console.log('Конец скрипта');
22+
```

0 commit comments

Comments
 (0)