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
Copy file name to clipboardExpand all lines: 1-js/11-async/02-promise-basics/article.md
+15-8Lines changed: 15 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -127,9 +127,9 @@ let promise = new Promise(function(resolve, reject) {
127
127
Свойства `state` и `result` - это внутренние свойства объекта `Promise` и мы не имеем к ним прямого доступа. Для обработки результата следует использовать методы `.then`/`.catch`/`.finally`, про них речь пойдёт дальше.
128
128
```
129
129
130
-
## Потребители: then, catch, finally
130
+
## Потребители: then, catch
131
131
132
-
Объект `Promise` служит связующим звеном между исполнителем ("создающим" кодом или "певцом") и функциями-потребителями ("фанатами"), которые получат либо результат, либо ошибку. Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов `.then`, `.catch` и `.finally`.
132
+
Объект `Promise` служит связующим звеном между исполнителем ("создающим" кодом или "певцом") и функциями-потребителями ("фанатами"), которые получат либо результат, либо ошибку. Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов `.then`и `.catch`.
133
133
134
134
### then
135
135
@@ -217,22 +217,29 @@ promise.catch(alert); // выведет "Error: Ошибка!" спустя од
217
217
218
218
Вызов `.finally(f)` похож на `.then(f, f)`, в том смысле, что `f` выполнится в любом случае, когда промис завершится: успешно или с ошибкой.
219
219
220
-
`finally` хорошо подходит для очистки, например остановки индикатора загрузки, его ведь нужно остановить вне зависимости от результата.
220
+
Идея `finally` состоит в том, чтобы настроить обработчик для выполнения очистки/доведения после завершения предыдущих операций.
221
221
222
-
Например:
222
+
Например, остановка индикаторов загрузки, закрытие больше не нужных соединений и т.д.
223
+
224
+
Думайте об этом как о завершении вечеринки. Независимо от того, была ли вечеринка хорошей или плохой, сколько на ней было друзей, нам все равно нужно (или, по крайней мере, мы должны) сделать уборку после нее.
225
+
226
+
Код может выглядеть следующим образом:
223
227
224
228
```js
225
229
new Promise((resolve, reject) => {
226
-
/* сделать что-то, что займёт время, и после вызвать resolve/reject */
230
+
/* сделать что-то, что займёт время, и после вызвать resolve или может reject */
227
231
})
228
232
*!*
229
233
// выполнится, когда промис завершится, независимо от того, успешно или нет
230
234
.finally(() => остановить индикатор загрузки)
235
+
// таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
Но это не совсем псевдоним `then(f,f)`, как можно было подумать. Существует несколько важных отличий:
240
+
Обратите внимание, что `finally(f)` - это не совсем псевдоним `then(f,f)`, как можно было подумать.
241
+
242
+
Есть важные различия:
236
243
237
244
1. Обработчик, вызываемый из `finally`, не имеет аргументов. В `finally` мы не знаем, как был завершён промис. И это нормально, потому что обычно наша задача - выполнить "общие" завершающие процедуры.
238
245
@@ -244,10 +251,10 @@ new Promise((resolve, reject) => {
244
251
245
252
```js run
246
253
new Promise((resolve, reject) => {
247
-
setTimeout(() => resolve("result"), 2000)
254
+
setTimeout(() => resolve("value"), 2000);
248
255
})
249
256
.finally(() => alert("Промис завершён")) // срабатывает первым
250
-
.then(result => alert(result)); // <-- .then показывает "значение"
257
+
.then(result => alert(result)); // <-- .then показывает "value"
251
258
```
252
259
253
260
Как вы можете видеть, значение возвращаемое первым промисом, передается через `finally` к следующему `then`.
0 commit comments