Skip to content

Commit e38a2ce

Browse files
authored
👾 smth
1 parent 6c93cda commit e38a2ce

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

1-js/11-async/02-promise-basics/article.md

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
# Промисы
23

34
Представьте, что вы известный певец, которого фанаты постоянно донимают расспросами о предстоящем сингле.
@@ -210,7 +211,7 @@ promise.catch(alert); // выведет "Error: Ошибка!" спустя од
210211
211212
Вызов `.catch(f)` - это сокращённый, "укороченный" вариант `.then(null, f)`.
212213
213-
### finally
214+
## Очистка: finally
214215
215216
По аналогии с блоком `finally` из обычного `try {...} catch {...}`, у промисов также есть метод `finally`.
216217
@@ -234,32 +235,46 @@ new Promise((resolve, reject) => {
234235
Но это не совсем псевдоним `then(f,f)`, как можно было подумать. Существует несколько важных отличий:
235236
236237
1. Обработчик, вызываемый из `finally`, не имеет аргументов. В `finally` мы не знаем, как был завершён промис. И это нормально, потому что обычно наша задача - выполнить "общие" завершающие процедуры.
238+
239+
Пожалуйста, взгляните на приведенный выше пример: как вы можете видеть, обработчик `finally` не имеет аргументов, а результат promise обрабатывается в следующем обработчике.
240+
237241
2. Обработчик `finally` "пропускает" результат или ошибку дальше, к последующим обработчикам.
238242
239243
Например, здесь результат проходит через `finally` к `then`:
244+
240245
```js run
241246
new Promise((resolve, reject) => {
242247
setTimeout(() => resolve("result"), 2000)
243248
})
244-
.finally(() => alert("Промис завершён"))
245-
.then(result => alert(result)); // <-- .then обработает результат
249+
.finally(() => alert("Промис завершён")) // срабатывает первым
250+
.then(result => alert(result)); // <-- .then показывает "значение"
246251
```
247-
252+
253+
Как вы можете видеть, значение возвращаемое первым промисом, передается через `finally` к следующему `then`.
254+
255+
Это очень удобно, потому что `finally` не предназначен для обработки результата промиса. Как уже было сказано, это место для проведения общей очистки, независимо от того, каков был результат.
256+
248257
А здесь ошибка из промиса проходит через `finally` к `catch`:
249258
250259
```js run
251260
new Promise((resolve, reject) => {
252261
throw new Error("error");
253262
})
254-
.finally(() => alert("Промис завершён"))
255-
.catch(err => alert(err)); // <-- .catch обработает объект ошибки
263+
.finally(() => alert("Промис завершён")) // срабатывает первым
264+
.catch(err => alert(err)); // <-- .catch показывает ошибку
256265
```
257266
258-
Это очень удобно, потому что `finally` не предназначен для обработки результата промиса. Так что он просто пропускает его через себя дальше.
267+
3. Обработчик `finally` также не должен ничего возвращать. Если это так, то возвращаемое значение молча игнорируется.
268+
269+
Единственным исключением из этого правила является случай, когда обработчик `finally` выдает ошибку. Затем эта ошибка передается следующему обработчику вместо любого предыдущего результата.
270+
271+
Подведем итог:
259272
260-
Мы более подробно поговорим о создании цепочек промисов и передаче результатов между обработчиками в следующей главе.
273+
- Обработчик `finally` не получает результат предыдущего обработчика (у него нет аргументов). Вместо этого этот результат передается следующему подходящему обработчику.
274+
- Если обработчик `finally` возвращает что-то, это игнорируется.
275+
- Когда `finally` выдает ошибку, выполнение переходит к ближайшему обработчику ошибок.
261276
262-
3. Последнее, но не менее значимое: вызов `.finally(f)` удобнее, чем `.then(f, f)` - не надо дублировать функции f.
277+
Эти функции полезны и заставляют все работать правильно, если мы используем `finally` так, как предполагается: для общих процедур очистки.
263278
264279
````smart header="На завершённых промисах обработчики запускаются сразу"
265280
Если промис в состоянии ожидания, обработчики в `.then/catch/finally` будут ждать его. Однако, если промис уже завершён, то обработчики выполнятся сразу:

0 commit comments

Comments
 (0)