-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathasyncAwait.js
More file actions
122 lines (92 loc) · 3.47 KB
/
asyncAwait.js
File metadata and controls
122 lines (92 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
async function showAvatar() {
// запрашиваем JSON с данными пользователя
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
// запрашиваем информацию об этом пользователе из github
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
let githubUser = await githubResponse.json();
// отображаем аватар пользователя
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img);
// ждём 3 секунды и затем скрываем аватар
await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser;
}
showAvatar();
// async function loadJson(url) {
// let response = await fetch(url)
// if (response.status == 200) {
// let json = await response.json()
// return json
// }
// throw new Error(response.status)
// }
// loadJson('no-such-user.json').catch(alert)
class HttpError extends Error {
constructor(response) {
super(`${response.status} for ${response.url}`);
this.name = 'HttpError';
this.response = response;
}
}
async function loadJson(url) {
let response = await fetch(url)
if (response.status == 200) {
return response.json()
} else {
throw new HttpError(response);
}
}
async function demoGithubUser() {
let user
while (true) {
let name = prompt('Enter login', 'iliakan')
try {
user = await loadJson(`https://api.github.com/users/${name}`)
break;
} catch (err) {
if (err instanceof HttpError && err.response.status == 404) {
alert("Такого пользователя не существует, пожалуйста, повторите ввод.")
} else {
throw err
}
}
}
alert(`Полное имя: ${user.name}`)
return user
}
demoGithubUser()
let range = {
from: 1,
to: 5,
// for await..of вызывает этот метод один раз в самом начале
[Symbol.asyncIterator]() { // (1)
// ...возвращает объект-итератор:
// далее for await..of работает только с этим объектом,
// запрашивая у него следующие значения вызовом next()
return {
current: this.from,
last: this.to,
// next() вызывается на каждой итерации цикла for await..of
async next() { // (2)
// должен возвращать значение как объект {done:.., value :...}
// (автоматически оборачивается в промис с помощью async)
// можно использовать await внутри для асинхронности:
await new Promise(resolve => setTimeout(resolve, 1000)); // (3)
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
}
};
(async () => {
for await (let value of range) { // (4)
alert(value); // 1,2,3,4,5
}
})()