You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Как сказано в [спецификации](https://tc39.github.io/ecma262/#sec-jobs-and-job-queues):
29
29
30
-
- Очередь определяется как первым-зашел-первым-вышел (FIFO): задачи, попавшие в очередь первыми, выполняются тоже первыми
30
+
- Очередь определяется как первым-зашел-первым-вышел (FIFO): задачи, попавшие в очередь первыми, выполняются тоже первыми.
31
31
- Выполнение задачи происходит только в том случае, если ничего больше не запущено.
32
32
33
33
Или, проще говоря, когда промис выполнен, его обработчики `.then/catch/finally` попадают в очередь. Они пока не выполняются. Движок JavaScript берёт задачу из очереди и выполняет ее, когда он освободится от выполнения текущего кода.
- внешний `<script src="...">` загружен, готов к выполнению.
65
65
- сетевая операция, например, `fetch` завершена.
66
66
- ... и т.д.
67
67
68
-
Что-то происходит -- движок это обрабатывает -- и снова ждет наступления события (пока он находится в спящем режиме, потребление ресурсов CPU близко к нулю).
68
+
Что-то происходит -- движок это обрабатывает -- и снова ждёт наступления события (пока он находится в спящем режиме, потребление ресурсов CPU близко к нулю).
69
69
70
70

71
71
72
-
Как вы можете видеть, здесь так же есть очередь. Так называемая "макроочередь задач (macrotask queue)" (v8 term).
72
+
Как вы можете видеть, здесь также есть очередь. Так называемая "макроочередь задач (macrotask queue)" (термин v8).
73
73
74
74
В случае, если событие наступает, когда движок занят, его обработка добавляется в очередь.
75
75
76
-
Например, когда движок занят обработкой сетевого запроса `fetch`, пользователь может перемещать указатель мыши благодаря обработке события `mousemove`, может быть вызван `setTimeout` и т.д. как показано на картинке выше.
76
+
Например, когда движок занят обработкой сетевого запроса `fetch`, пользователь может перемещать указатель мыши, вызывая событие `mousemove`, может сработать `setTimeout` и т.д., как показано на картинке выше.
77
77
78
78
События из очереди макрособытий обрабатываются по принципу первый зашел - первый обслужен. Когда движок браузера заканчивает с выполнением `fetch`, он обрабатывает событие `mousemove`, потом вызывает обработчик `setTimeout` и т.д.
79
79
80
-
Пока все довольно понятно, не так ли? Движок занят, соответственно другие задачи ждут в очереди.
80
+
Пока всё довольно понятно, не так ли? Движок занят, соответственно другие задачи ждут в очереди.
81
81
82
82
Сейчас важный момент.
83
83
@@ -102,7 +102,7 @@ alert("code");
102
102
2.`promise` отображается вторым, т.к. `.then` проходит через очередь микрозадач и запускается после текущего кода.
103
103
3.`timeout`- показывается последним, т.к. это макрозадача.
104
104
105
-
Может случится так, что в процессе выполнения макрозадачи будет создан новый промис.
105
+
Может случиться так, что в процессе выполнения макрозадачи будет создан новый промис.
106
106
107
107
Или наоборот, в микрозадаче будет запланирована макрозадача (например `setTimeout`).
108
108
@@ -120,7 +120,7 @@ Promise.resolve()
120
120
121
121
Естественно, `promise` отображается первым, т.к. макрозадача `setTimeout` ожидает в менее приоритетной очереди макрозадач.
122
122
123
-
В качестве логического cледствия, макрозадачи выполняются только когда промисы дают движку "свободное время". Так если у нас есть цепочка промисов не ожидающая ничего, то такие вещи как `setTimeout` или обработчики событий могут никогда не попасть в середину.
123
+
В качестве логического cледствия, макрозадачи выполняются, только когда промисы дают движку "свободное время". Так, если у нас есть цепочка промисов, не ожидающая ничего, как `setTimeout` или обработчики событий могут никогда не попасть в середину (между промисами).
Мы создаем rejected `промис` и не обрабатываем ошибку. Таким образом, мы видим событие "unhandled rejection" (также будет выведено в консоли).
144
+
Мы создаем отклонённый (rejected)`промис` и не обрабатываем ошибку. Таким образом, мы видим событие "unhandled rejection" (также будет выведено в консоли).
145
145
146
146
Мы не получим его, если мы добавим `.catch`, например так:
147
147
@@ -151,11 +151,11 @@ let promise = Promise.reject(new Error("Promise Failed!"));
0 commit comments