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/08-async-await/01-rewrite-async/solution.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,4 +30,4 @@ loadJson('no-such-user.json')
30
30
```
31
31
32
32
Тогда внешнему коду пришлось бы получать результат промиса самостоятельно (через `.then` или `await`). В нашем варианте это не обязательно.
33
-
4.Брошенная из `loadJson` ошибка перехватывается с помощью `.catch`. Здесь нельзя использовать `await loadJson(…)`, так как мы находимся не в теле `async` функции.
33
+
4.Выброшенная из `loadJson` ошибка перехватывается с помощью `.catch`. Здесь нельзя использовать `await loadJson(…)`, так как мы находимся не в теле функции `async`.
Copy file name to clipboardExpand all lines: 1-js/11-async/08-async-await/article.md
+17-17Lines changed: 17 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,19 +2,19 @@
2
2
3
3
Существует специальный синтаксис для работы с промисами, который называется "async/await". Он очень простой и наглядный.
4
4
5
-
## Async функции
5
+
## Асинхронные функции
6
6
7
-
Объявление функции можно начать с ключевого слова `async`:
7
+
Объявление асинхронной функции можно начать с ключевого слова `async`:
8
8
9
9
```js
10
10
asyncfunctionf() {
11
11
return1;
12
12
}
13
13
```
14
14
15
-
Функция, перед объявлением которой находится ключевое слово "async", всегда возвращает промис. Значения, отличные от промисов, будут оборачиваться в успешно завершившийся промис автоматически.
15
+
Функция, перед объявлением которой находится ключевое слово "async", всегда возвращает промис. Значения других типов оборачиваются в завершившийся успешно промис автоматически.
16
16
17
-
Например, эта функция возвратит промис в `fulfilled` состоянии с результатом `1`:
17
+
Например, эта функция возвратит выполненый промис с результатом `1`:
18
18
19
19
```js run
20
20
asyncfunctionf() {
@@ -34,14 +34,14 @@ async function f() {
34
34
f().then(alert); // 1
35
35
```
36
36
37
-
Получается, ключевое слово `async` перед функцией гарантирует, что эта функция в любом случае вернёт промис. Согласитесь, достаточно просто? Но это ещё не всё. Есть другое ключевое слово – `await`, которое можно использовать только внутри `async`функций.
37
+
Получается, ключевое слово `async` перед функцией гарантирует, что эта функция в любом случае вернёт промис. Согласитесь, достаточно просто? Но это ещё не всё. Есть другое ключевое слово – `await`, которое можно использовать только внутри `async`–функций.
38
38
39
39
## Await
40
40
41
41
Синтаксис:
42
42
43
43
```js
44
-
// работает только внутри asyncфункций
44
+
// работает только внутри async–функций
45
45
let value =await promise;
46
46
```
47
47
@@ -68,7 +68,7 @@ f();
68
68
69
69
В данном примере выполнение функции остановится на строке `(*)` до тех пор, пока промис не перейдёт в состояние `fulfilled`. Это произойдёт через секунду после запуска функции. После чего в переменную `result` будет записан результат выполнения промиса, и браузер отобразит alert-окно «готово!».
70
70
71
-
Обратите внимание, хотя `await` заставляет JavaScript дожидаться выполнения промиса, это не отнимает ресурсов процессора. Пока промис не выполнится, JSдвижок может заниматься другими задачами – выполнять прочие скрипты, обрабатывать события и т.п.
71
+
Обратите внимание, хотя `await` заставляет JavaScript дожидаться выполнения промиса, это не отнимает ресурсов процессора. Пока промис не выполнится, JS-движок может заниматься другими задачами – выполнять прочие скрипты, обрабатывать события и т.п.
72
72
73
73
По сути, это просто "синтаксический сахар" для получения результата промиса, более наглядный, чем `promise.then`.
74
74
@@ -84,7 +84,7 @@ function f() {
84
84
}
85
85
```
86
86
87
-
Ошибки не будет, если мы укажем ключевое слово `async` перед объявлением функции. Как было сказано раньше, `await` можно использовать только внутри `async`функций.
87
+
Ошибки не будет, если мы укажем ключевое слово `async` перед объявлением функции. Как было сказано раньше, `await` можно использовать только внутри `async`–функций.
88
88
````
89
89
90
90
Давайте перепишем пример `showAvatar()` из раздела <info:promise-chaining> с помощью `async/await`:
@@ -123,15 +123,15 @@ showAvatar();
123
123
Получилось очень просто и читаемо, правда? Гораздо лучше, чем раньше.
124
124
125
125
````smart header="`await` нельзя использовать на верхнем уровне вложенности"
126
-
Программисты, узнав об `await`, часто пытаются использовать эту возможность на верхнем уровне вложенности (вне тела функции). Но из-за того, что `await` работает только внутри `async`функций, так сделать не получится:
126
+
Программисты, узнав об `await`, часто пытаются использовать эту возможность на верхнем уровне вложенности (вне тела функции). Но из-за того, что `await` работает только внутри `async`–функций, так сделать не получится:
127
127
128
128
```js run
129
129
// SyntaxError на верхнем уровне вложенности
130
130
let response = await fetch('/article/promise-chaining/user.json');
131
131
let user = await response.json();
132
132
```
133
133
134
-
Можно обернуть этот код в анонимную `async`функцию, тогда всё заработает:
134
+
Можно обернуть этот код в анонимную `async`–функцию, тогда всё заработает:
135
135
136
136
```js run
137
137
(async () => {
@@ -143,7 +143,7 @@ let user = await response.json();
143
143
144
144
145
145
````
146
-
````smart header="`await` работает с \"thenable\" объектами"
146
+
````smart header="`await` работает с объектами типа \"thenable\""
147
147
Любой объект может не быть промисом, но реализовать их интерфейс (быть промис-совместимым). Если у объекта можно вызвать метод `then`, этого достаточно, чтобы использовать его с `await`.
148
148
149
149
В примере ниже, экземпляры класса `Thenable` будут работать вместе с `await`:
@@ -173,8 +173,8 @@ f();
173
173
Когда `await` получает объект с `.then` (не являющийся промисом), JavaScript автоматически запускает этот метод, передавая ему аргументы – встроенные функции `resolve` и `reject`. `await` приостановит дальнейшее выполнение кода, пока любая из этих функций не будет вызвана (в примере, это строка `(*)`). После чего выполнение кода продолжится с результатом `resolve` или `reject` соответственно.
174
174
````
175
175
176
-
````smart header="Async методы"
177
-
Можно создавать async методы:
176
+
````smart header="Асинхронные методы"
177
+
Для объявления асинхронного метода достаточно написать `async` перед именем:
178
178
179
179
```js run
180
180
class Waiter {
@@ -189,7 +189,7 @@ new Waiter()
189
189
.wait()
190
190
.then(alert); // 1
191
191
```
192
-
Как и с async функциями, такой метод гарантированно возвращает промис и в его теле можно использовать `await`.
192
+
Как и с асинхронными функциями, такой метод гарантированно возвращает промис и в его теле можно использовать `await`.
193
193
194
194
````
195
195
## Обработка ошибок
@@ -252,7 +252,7 @@ async function f() {
252
252
f();
253
253
```
254
254
255
-
Если из этой функции убрать блок `try..catch`, промис, сгенерированный вызовом async функции `f()`, возвратится в состоянии rejected. Мы можем использовать метод `.catch` промиса, чтобы обработать ошибку:
255
+
Если из функции `f()`убрать блок `try..catch`, она будет возвращать завершившийся с ошибкой промис (в состоянии rejected). В этом случае мы можем использовать метод `.catch` промиса, чтобы обработать ошибку:
Если забыть добавить `.catch` возвращаемому rejectedпромису, будет сгенерирована ошибка "Uncaught promise error" и информация об этом будет выведена в консоль. Такие ошибки тоже можно отловить и обработать, об этом подробно написано в разделе <info:promise-error-handling>.
268
+
Если забыть добавить `.catch` возвращаемому `rejected`–промису, будет сгенерирована ошибка "Uncaught promise error" и информация об этом будет выведена в консоль. Такие ошибки тоже можно отловить и обработать, об этом подробно написано в разделе <info:promise-error-handling>.
269
269
270
270
```smart header="`async/await` и `promise.then/catch`"
271
271
При работе с `async/await`, `.then` используется не часто, так как `await` автоматически ожидает завершения выполнения промиса. В этом случае, обычно (но не всегда) гораздо удобнее перехватывать ошибки используя `try..catch`, нежели чем `.catch`.
272
272
273
-
Но на верхнем уровне вложенности (вне `async`функций) `await` использовать нельзя, поэтому `.then/catch` для обработки финального результата или ошибок – обычная практика.
273
+
Но на верхнем уровне вложенности (вне `async`–функций) `await` использовать нельзя, поэтому `.then/catch` для обработки финального результата или ошибок – обычная практика.
0 commit comments