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
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,17 +2,17 @@
2
2
3
3
Представьте, что вы известный певец, которого фанаты постоянно донимают расспросами о предстоящем сингле.
4
4
5
-
Чтобы получить передышку, вы обещаете разослать им сингл, когда он будет выпущен. Вы даете фанатам список, в который они могут записаться, чтобы получать новости. Они могут оставить свой e-mail, чтобы когда песня выйдет сразу получить её. И даже больше, если, например, вы передумаете выпускать песню, они также получат уведомление об этом.
5
+
Чтобы получить передышку, вы обещаете разослать им сингл, когда он будет выпущен. Вы даете фанатам список, в который они могут записаться, чтобы получать новости. Они могут оставить свой e-mail, чтобы получить песню, как только она выйдет. И даже больше, если, например, вы передумаете выпускать песню, они также получат уведомление об этом.
6
6
7
-
Все счастливы! Вы счастливы, потому что вас больше не донимают фанаты, а фанаты - могут больше не беспокоится, что пропустят новый сингл.
7
+
Все счастливы! Вы счастливы, потому что вас больше не донимают фанаты, а фанаты могут больше не беспокоится, что пропустят новый сингл.
8
8
9
9
Это аналогия из реальной жизни для ситуаций, с которыми мы часто сталкиваемся в программировании:
10
10
11
11
1. "Певец" - это "создающий" код, который делает что-то, что занимает время. Например, скачивает новый скрипт.
12
12
2. "Фанаты" - это "потребляющий" код, который хочет получить результат "создающего" кода, когда он будет готов. Этот результат может быть необходим большому количеству функций.
13
13
3.*Promise* (обещание) - это специальный объект в JavaScript, который связывает "создающий" и "потребляющий" коды вместе. В терминах нашей аналогии - это "список подписок". "Создающий" код может выполнятся любое необходимое ему время, чтобы получить обещанный результат, а *промис* делает результат доступным для всего кода, который подписан на него, когда результат готов.
14
14
15
-
Аналогия не совсем точна, потому что объект Promise в JavaScript гораздо сложнее простого списка подписок: он обладает дополнительными возможностями и ограничениями. Но для начала и она хороша.
15
+
Аналогия не совсем точна, потому что объект Promise в JavaScript гораздо сложнее простого списка подписок: он обладает дополнительными возможностями и ограничениями. Но для начала и такая аналогия хороша.
16
16
17
17
Синтаксис создания `Promise`:
18
18
@@ -93,7 +93,7 @@ let promise = new Promise(function(resolve, reject) {
93
93
});
94
94
```
95
95
96
-
Идея в том, что задача выполняемая исполнителем может иметь только один итог: результат или ошибку.
96
+
Идея в том, что задача, выполняемая исполнителем, может иметь только один итог: результат или ошибку.
97
97
98
98
Также, `resolve`/`reject` ожидает только один аргумент (или ни одного), а все дополнительные аргументы будут проигнорированы.
99
99
````
@@ -123,7 +123,7 @@ let promise = new Promise(function(resolve, reject) {
123
123
124
124
## Потребители: then, catch, finally
125
125
126
-
Объект `Promise` служит связующем звеном между исполнителем ("создающим" кодом или "певцом") и функциями-потребителями ("фанатами"), которые получат, либо результат, либо ошибку. Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов `.then`, `.catch` и `.finally`.
126
+
Объект `Promise` служит связующим звеном между исполнителем ("создающим" кодом или "певцом") и функциями-потребителями ("фанатами"), которые получат либо результат, либо ошибку. Функции-потребители могут быть зарегистрированы (подписаны) с помощью методов `.then`, `.catch` и `.finally`.
127
127
128
128
### Метод then (после)
129
129
@@ -215,7 +215,7 @@ promise.catch(alert); // выведет "Error: Whoops!" спустя одну
215
215
216
216
По аналогии с блоком `finally` из обычного `try {...} catch {...}`, в `promise`, также есть метод `finally`.
217
217
218
-
Вызов `.finally(f)` это тоже самое, что передать в `.then(f, f)`, в том смысле, что "потребляющий" код выполниться в любом случае, когда промис станет решённым: успешно или с ошибкой.
218
+
Вызов `.finally(f)` это тоже самое, что передать в `.then(f, f)`, в том смысле, что "потребляющий" код выполнится в любом случае, когда промис станет решённым: успешно или с ошибкой.
219
219
220
220
`finally` хорошо подходит для очистки, например остановки индикаторов загрузки, поскольку они будут не нужны в независимости от результата.
221
221
@@ -234,7 +234,7 @@ new Promise((resolve, reject) => {
234
234
235
235
Это не совсем псевдоним, как можно было подумать. Существует несколько важных отличий:
236
236
237
-
1. Обработчик, вызываемый из `finally` не имеет аргументов. В `finally` мы не знаем, как был завершён `Promise`. И это нормально, потому что обычно, наша задача - выполнить "основные" завершающие процедуры.
237
+
1. Обработчик, вызываемый из `finally` не имеет аргументов. В `finally` мы не знаем, как был завершён `Promise`. И это нормально, потому что обычно наша задача - выполнить "основные" завершающие процедуры.
238
238
2. `Finally` пропустит результат или ошибку к следующим обработчикам.
239
239
240
240
Например, здесь результат проходит через `finally` к `then`:
@@ -260,7 +260,7 @@ new Promise((resolve, reject) => {
260
260
261
261
Мы поговорим о создании цепочек промисов и передаче результатов между обработчиками в следующей главе.
262
262
263
-
3. Последнее, но не менее значимое, у метода `.finally(f)` более удобный синтаксис, чем у`.then(f, f)`: не надо дублировать функции.
263
+
3. Последнее, но не менее значимое, у метода `.finally(f)` более удобный синтаксис, чем у`.then(f, f)` - не надо дублировать функции.
Если промис в состоянии ожидания, обработчики в `.then/catch/finally` будут ждать его окончания. Однако, если `promise` уже решён, тогда обработчики выполнятся сразу:
@@ -296,7 +296,7 @@ function loadScript(src, callback) {
296
296
297
297
Теперь перепишем её используя `Promise`.
298
298
299
-
Новой функции `loadScript` будет не нужен аргумент callback. Вместо этого она будет создавать и возвращать объект `Promise`, который будет переходить в состояние решён, когда загрузка закончится. Внешний код может добавлять обработчики (функции-подписчиков) используя для этого метод `.then`:
299
+
Новой функции `loadScript` будет не нужен аргумент callback. Вместо этого она будет создавать и возвращать объект `Promise`, который будет переходить в состояние решён, когда загрузка закончится. Внешний код может добавлять обработчики (функции-подписчиков), используя для этого метод `.then`:
300
300
301
301
```js run
302
302
functionloadScript(src) {
@@ -330,7 +330,7 @@ promise.then(script => alert('One more handler to do something else!'));
330
330
331
331
| Promises | Callbacks |
332
332
|----------|-----------|
333
-
| Промисы позволяют делать вещи в естественном порядке. Сперва мы запускаем `loadScript(script)`, и затем (`.then`) мы пишем, что делать с результатом. | У нас должна быть функция`callback` на момент вызова `loadScript(script, callback)`. Другими словами, нам нужно знать что делать с результатом,*до того*, как вызвать `loadScript`. |
333
+
| Промисы позволяют делать вещи в естественном порядке. Сперва мы запускаем `loadScript(script)`, и затем (`.then`) мы пишем, что делать с результатом. | У нас должна быть функция`callback` на момент вызова `loadScript(script, callback)`. Другими словами, нам нужно знать что делать с результатом *до того*, как вызвать `loadScript`. |
334
334
| Мы можем вызывать `.then` у `Promise` столько раз, сколько захотим. Каждый раз, мы добавляем нового "фаната", новую функцию-подписчика, в "список подписок". Больше об этом в следующей главе: [](info:promise-chaining). | Колбэк может быть только один. |
335
335
336
336
Таким образом, промисы позволяют улучшить порядок кода и дают нам гибкость. Но это ещё не всё. Мы увидим это в следующих главах.
0 commit comments