Skip to content

Commit dc3c45c

Browse files
Fetch: Abort (#306)
* Fetch: Abort * Update 5-network/04-fetch-abort/article.md * Update 5-network/04-fetch-abort/article.md Co-authored-by: Mykola Sopiha <[email protected]>
1 parent 2e54aae commit dc3c45c

File tree

1 file changed

+54
-54
lines changed

1 file changed

+54
-54
lines changed

5-network/04-fetch-abort/article.md

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,60 @@
11

2-
# Fetch: Abort
2+
# Fetch: Переривання
33

4-
As we know, `fetch` returns a promise. And JavaScript generally has no concept of "aborting" a promise. So how can we cancel an ongoing `fetch`? E.g. if the user actions on our site indicate that the `fetch` isn't needed any more.
4+
Як ми знаємо, `fetch` повертає проміс. А в JavaScript, як правило, немає концепції "переривання" промісу. Отже, як ми можемо перервати поточний `fetch`? Наприклад, якщо дії користувача на нашому сайті вказують на те, що `fetch` більше не потрібен.
55

6-
There's a special built-in object for such purposes: `AbortController`. It can be used to abort not only `fetch`, but other asynchronous tasks as well.
6+
Для таких цілей є спеціальний вбудований об’єкт: `AbortController`. Його можна використовувати для переривання не тільки `fetch`, але й інших асинхронних завдань.
77

8-
The usage is very straightforward:
8+
Його використання дуже просте:
99

10-
## The AbortController object
10+
## Об’єкт AbortController
1111

12-
Create a controller:
12+
Створімо контролер:
1313

1414
```js
1515
let controller = new AbortController();
1616
```
1717

18-
A controller is an extremely simple object.
18+
Контролер -- це надзвичайно простий об’єкт.
1919

20-
- It has a single method `abort()`,
21-
- And a single property `signal` that allows to set event listeners on it.
20+
- Він має єдиний метод `abort()`,
21+
- І єдину властивість `signal`, що дозволяє встановлювати на ньому обробники подій.
2222

23-
When `abort()` is called:
24-
- `controller.signal` emits the `"abort"` event.
25-
- `controller.signal.aborted` property becomes `true`.
23+
Коли викликається `abort()`:
24+
- `controller.signal` генерує подію `"abort"`.
25+
- Властивість `controller.signal.aborted` стає `true`.
2626

27-
Generally, we have two parties in the process:
28-
1. The one that performs a cancelable operation, it sets a listener on `controller.signal`.
29-
2. The one that cancels: it calls `controller.abort()` when needed.
27+
Як правило, у нас є дві сторони в процесі:
28+
1. Та, що виконує операцію, яку можна скасувати, встановлює прослуховувач на `controller.signal`.
29+
2. Та, що скасовує: вона викликає `controller.abort()`, коли потрібно.
3030

31-
Here's the full example (without `fetch` yet):
31+
Ось повний приклад (поки що без `fetch`):
3232

3333
```js run
3434
let controller = new AbortController();
3535
let signal = controller.signal;
3636

37-
// The party that performs a cancelable operation
38-
// gets the "signal" object
39-
// and sets the listener to trigger when controller.abort() is called
40-
signal.addEventListener('abort', () => alert("abort!"));
37+
// Сторона, що виконує операцію, яку можна скасувати
38+
// отримує об’єкт "signal"
39+
// і налаштовує прослуховувач на тригер, коли викликається controller.abort()
40+
signal.addEventListener('abort', () => alert("переривання!"));
4141

42-
// The other party, that cancels (at any point later):
43-
controller.abort(); // abort!
42+
// Інша сторона, що скасовує (в будь-який момент пізніше):
43+
controller.abort(); // переривання!
4444

45-
// The event triggers and signal.aborted becomes true
45+
// Подія запускається, і signal.aborted стає true
4646
alert(signal.aborted); // true
4747
```
4848

49-
As we can see, `AbortController` is just a mean to pass `abort` events when `abort()` is called on it.
49+
Як ми бачимо, `AbortController` є лише засобом для передачі подій `abort`, коли для нього викликається `abort()`.
5050

51-
We could implement the same kind of event listening in our code on our own, without the `AbortController` object.
51+
Ми могли б реалізувати такий самий тип прослуховування подій у нашому коді самостійно, без об’єкта `AbortController`.
5252

53-
But what's valuable is that `fetch` knows how to work with the `AbortController` object. It's integrated in it.
53+
Але цінним є те, що `fetch` знає, як працювати з об’єктом `AbortController`. Він інтегрований у нього.
5454

55-
## Using with fetch
55+
## Використання з fetch
5656

57-
To be able to cancel `fetch`, pass the `signal` property of an `AbortController` as a `fetch` option:
57+
Щоб мати можливість скасувати `fetch`, передайте властивість `signal` у `AbortController` як параметр `fetch`:
5858

5959
```js
6060
let controller = new AbortController();
@@ -63,22 +63,22 @@ fetch(url, {
6363
});
6464
```
6565

66-
The `fetch` method knows how to work with `AbortController`. It will listen to `abort` events on `signal`.
66+
Метод `fetch` знає, як працювати з `AbortController`. Він прослуховуватиме події `abort` за `signal`.
6767

68-
Now, to abort, call `controller.abort()`:
68+
Тепер, щоб перервати, викличте `controller.abort()`:
6969

7070
```js
7171
controller.abort();
7272
```
7373

74-
We're done: `fetch` gets the event from `signal` and aborts the request.
74+
Ми закінчили: `fetch` отримує подію з `signal` і скасовує запит.
7575

76-
When a fetch is aborted, its promise rejects with an error `AbortError`, so we should handle it, e.g. in `try..catch`.
76+
Коли `fetch` переривається, його проміс завершує виконання з помилкою `AbortError`, тому ми повинні обробити її, наприклад в `try..catch`.
7777

78-
Here's the full example with `fetch` aborted after 1 second:
78+
Ось повний приклад із `fetch`, що переривається через 1 секунду:
7979

8080
```js run async
81-
// abort in 1 second
81+
// перервати через 1 секунду
8282
let controller = new AbortController();
8383
setTimeout(() => controller.abort(), 1000);
8484

@@ -87,62 +87,62 @@ try {
8787
signal: controller.signal
8888
});
8989
} catch(err) {
90-
if (err.name == 'AbortError') { // handle abort()
91-
alert("Aborted!");
90+
if (err.name == 'AbortError') { // обробити abort()
91+
alert("Перервано!");
9292
} else {
9393
throw err;
9494
}
9595
}
9696
```
9797

98-
## AbortController is scalable
98+
## AbortController є масштабованим
9999

100-
`AbortController` is scalable. It allows to cancel multiple fetches at once.
100+
`AbortController` є масштабованим. Він дозволяє призупинити кілька `fetch` одночасно.
101101

102-
Here's a sketch of code that fetches many `urls` in parallel, and uses a single controller to abort them all:
102+
Ось приклад коду, який отримує багато `URL` паралельно та використовує один контролер, щоб скасувати їх усі:
103103

104104
```js
105-
let urls = [...]; // a list of urls to fetch in parallel
105+
let urls = [...]; // список URL для паралельних fetch
106106

107107
let controller = new AbortController();
108108

109-
// an array of fetch promises
109+
// масив промісів fetch
110110
let fetchJobs = urls.map(url => fetch(url, {
111111
signal: controller.signal
112112
}));
113113

114114
let results = await Promise.all(fetchJobs);
115115

116-
// if controller.abort() is called from anywhere,
117-
// it aborts all fetches
116+
// якщо controller.abort() викликається з будь-якого місця,
117+
// він перериває всі fetch
118118
```
119119

120-
If we have our own asynchronous tasks, different from `fetch`, we can use a single `AbortController` to stop those, together with fetches.
120+
Якщо у нас є власні асинхронні завдання, відмінні від `fetch`, ми можемо використовувати єдиний `AbortController`, щоб зупинити їх, разом із `fetch`.
121121

122-
We just need to listen to its `abort` event in our tasks:
122+
Нам просто потрібно прослуховувати подію `abort` в наших завданнях:
123123

124124
```js
125125
let urls = [...];
126126
let controller = new AbortController();
127127

128-
let ourJob = new Promise((resolve, reject) => { // our task
128+
let ourJob = new Promise((resolve, reject) => { // наше завдання
129129
...
130130
controller.signal.addEventListener('abort', reject);
131131
});
132132

133-
let fetchJobs = urls.map(url => fetch(url, { // fetches
133+
let fetchJobs = urls.map(url => fetch(url, { // запити fetch
134134
signal: controller.signal
135135
}));
136136

137-
// Wait for fetches and our task in parallel
137+
// Чекаємо на виконання запитів fetch та наших завдань паралельно
138138
let results = await Promise.all([...fetchJobs, ourJob]);
139139

140-
// if controller.abort() is called from anywhere,
141-
// it aborts all fetches and ourJob
140+
// якщо controller.abort() викликається з будь-якого місця,
141+
// він перериває всі fetch та ourJob
142142
```
143143

144-
## Summary
144+
## Підсумки
145145

146-
- `AbortController` is a simple object that generates an `abort` event on it's `signal` property when the `abort()` method is called (and also sets `signal.aborted` to `true`).
147-
- `fetch` integrates with it: we pass the `signal` property as the option, and then `fetch` listens to it, so it's possible to abort the `fetch`.
148-
- We can use `AbortController` in our code. The "call `abort()`" -> "listen to `abort` event" interaction is simple and universal. We can use it even without `fetch`.
146+
- `AbortController` -- це простий об’єкт, який генерує подію `abort` для своєї властивості `signal` під час виклику методу `abort()` (а також встановлює для `signal.aborted` значення `true`).
147+
- `fetch` інтегрується з ним: ми передаємо властивість `signal` як параметр, а потім `fetch` прослуховує його, тому можна перервати цей `fetch`.
148+
- Ми можемо використовувати `AbortController` у нашому коді. Взаємодія "виклик `abort()`" -> "прослуховування події `abort`" проста та універсальна. Ми можемо використовувати його навіть без `fetch`.

0 commit comments

Comments
 (0)