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
-
- Очередь определяется как первым-зашел-первым-вышел: задачи берутся из очереди первыми и выполняются первыми.
30
+
- Очередь определяется как первым-зашел-первым-вышел (FIFO): задачи, попавшие в очередь первыми, выполняются тоже первыми
31
31
- Выполнение задачи происходит только в том случае, если ничего больше не запущено.
32
32
33
-
Или, проще говоря, когда промис выполнен, его обработчики `.then/catch/finally` попадают в очередь. Они пока не выполняются. Движок JavaScript берет задачу из очереди и выполняет ее, когда он освободится от выполнения текущего кода.
33
+
Или, проще говоря, когда промис выполнен, его обработчики `.then/catch/finally` попадают в очередь. Они пока не выполняются. Движок JavaScript берёт задачу из очереди и выполняет ее, когда он освободится от выполнения текущего кода.
34
34
35
35
Вот почему сообщение "код выполнен" в примере выше будет показано первым.
Если есть цепочка с несколькими `.then/catch/finally`, то каждый из них выполняется асинхронно. То есть сначала ставится в очередь, а потом выполняется, когда выполнение текущего кода завершено и добавленные ранее в очередь обработчики выполнены.
42
42
43
-
**Но что если порядок имеет значение для нас? Как мы можем сделать работу `код выполнен` после того, как`промис завершен`?**
43
+
**Но что если порядок имеет значение для нас? Как мы можем вывести `код выполнен` после `промис завершен`?**
44
44
45
-
Легко, просто добавим её в очередь вместе с`.then`:
45
+
Легко, используя`.then`:
46
46
47
47
```js run
48
48
Promise.resolve()
@@ -56,7 +56,7 @@ Promise.resolve()
56
56
57
57
Браузерный JavaScript, также как Node.js, основывается на *цикле событий (event loop)*.
58
58
59
-
"Цикл событий" это процесс, при котором движок спит и ждет очереди, потом реагирует на нее и снова засыпает.
59
+
"Цикл событий" - это процесс, при котором движок спит и ждёт очереди, а потом реагирует на неё и снова засыпает.
Сейчас снова возник необработанный rejection. Почему? Потому что `unhandledrejection` срабатывает, когда очередь микрозадач выполнена. Движок проверяет промисы и, если если какой-либо из них в состоянии "rejected", то генерируется событие.
171
171
172
-
В примере `.catch`, добавленный в `setTimeout`, также срабатывает, конечно срабатывает, но позже, после возникновения `unhandledrejection`.
172
+
В примере `.catch`, добавленный в `setTimeout`, также срабатывает, но позже, после возникновения `unhandledrejection`.
173
173
174
174
## Итого
175
175
176
-
- Обработка промисов всегда синхронная, т.к. все действия промисов проходят через внутреннюю очередь "promise jobs", также называемую "очередь микрозадач (microtask queue)" (термин v8).
176
+
- Обработка промисов всегда асинхронная, т.к. все действия промисов проходят через внутреннюю очередь "promise jobs", так называемая "очередь микрозадач (microtask queue)" (термин v8).
177
177
178
178
**Таким образом, `.then/catch/finally` вызывается после выполнения текущего кода.**
179
179
180
180
Если нам нужно гарантировать выполнение части кода после `.then/catch/finally`, то лучше всего добавить его вызов в цепочку `.then`.
181
181
182
-
- Существует также "очередь макрозадач (macrotask queue)", которая содержит различные события, результаты сетевых операций, запланированные вызовы `setTimeout` и т.д. Они также называются "макрозадачами" (macrotasks) (термин v8).
182
+
- Существует также "очередь макрозадач (macrotask queue)", которая содержит различные события, результаты сетевых операций, запланированные вызовы `setTimeout` и т.д. Они также называются "макрозадачами" (macrotasks) (термин v8).
183
183
184
184
Движок использует очередь макрозадач для их выполнения в порядке появления.
185
185
186
-
**Макрозадачи запускаются после выполнения кода *и* после того как очередь микрозадач будет пуста.**
186
+
**Макрозадачи запускаются после выполнения кода *и* после того, как очередь микрозадач будет пуста.**
187
187
188
188
Другими словами, они имеют более низкий приоритет.
189
189
190
-
Таким образом порядок выполнения следующий: обычный код, потом обработка промисов, потом все остальное, такое как события и т.д.
190
+
Таким образом, порядок выполнения следующий: обычный код, потом обработка промисов, потом всё остальное (события и т.д.).
0 commit comments