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/03-promise-chaining/article.md
+7-10Lines changed: 7 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -72,7 +72,7 @@ promise.then(function(result) {
72
72
});
73
73
```
74
74
75
-
Те, що ми зробили тут -- це просто додали кілька обробників до одного промісу. Вони не передають результат один одному по ланцюжку. Вони кожен по своєму обробляють результат одного і того ж проміса.
75
+
Те, що ми зробили тут -- це просто додали кілька обробників до одного промісу. Вони не передають результат один одному ланцюжком. Натомість кожен по своєму обробляє результат одного і того ж проміса.
76
76
77
77
Ось малюнок (порівняйте його з ланцюжком вище):
78
78
@@ -216,7 +216,7 @@ new Promise(resolve => resolve(1))
216
216
.then(alert); // показує 2 через 1000 мс
217
217
```
218
218
219
-
JavaScript перевіряє об’єкт, повернутий обробником `.then` у рядку `(*)`: якщо він має придатний до викликання метод з ім’ям `then`, тоді він викликає цей метод, та передає йому власні функції `resolve`, `reject` як аргументи (подібно виконавцю) і чекає, поки один з них не буде викликаний. У наведеному вище прикладі `resolve(2)` викликається через 1 секунду `(**)`. Потім результат передається далі по ланцюжку.
219
+
JavaScript перевіряє об’єкт, повернутий обробником `.then` у рядку `(*)`: якщо він має придатний до виклику метод з ім’ям `then`, тоді він викликає цей метод, та передає йому власні функції `resolve`, `reject` як аргументи (подібно виконавцю) і чекає, поки один з них не буде викликаний. У наведеному вище прикладі `resolve(2)` викликається через 1 секунду `(**)`. Потім результат передається далі по ланцюжку.
220
220
221
221
Ця функція дозволяє нам інтегрувати власні об’єкти з ланцюжками промісів без успадкування від `Promise`.
Зазначений код робить мережевий запит до `url` і повертає проміс. Цей проміс переходить в стан "fullfilled" і його value стає об'єкт `response` (іншими словами, проміс завершується об'єктом `response`) як тільки-но віддалений сервер присилає заголовки, але ще *до завантаження повної відповіді*.
235
+
Зазначений код робить мережевий запит до `url` і повертає проміс. Цей проміс переходить в стан "fullfilled" і його `value` стає об'єкт `response` (іншими словами, проміс завершується об'єктом `response`) як тільки віддалений сервер присилає заголовки, але ще *до завантаження повної відповіді*.
236
236
237
-
Щоб прочитати повну відповідь, ми повинні викликати метод `response.text()`. Цей метод повертає проміс.
238
-
Цей проміс (який ми отримуємо як результат метода `response.text()`):
239
-
1. Завершується аж тоді, коли з віддаленого сервера завантажується увесь текст, не лише заголовки.
240
-
2. Після завершення він містить той текст в якості результату.
237
+
Щоб прочитати повну відповідь, ми повинні викликати метод `response.text()`, він в свою чергу повертає новий проміс. Цей новий проміс завершується лише тоді, коли з віддаленого сервера завантажується увесь текст, не лише заголовки. Після завершення він буде містити весь текст відповіді в якості результату.
241
238
242
239
Наведений нижче код робить запит до `user.json` і завантажує його текст із сервера:
243
240
244
241
```js run
245
242
fetch('/article/promise-chaining/user.json')
246
-
// .then нижче запускається, коли віддалений сервер прислав заголовки
243
+
// .then нижче запускається, коли віддалений сервер надіслав заголовки
247
244
.then(function(response) {
248
245
// response.text() повертає новий проміс, який завершується повним текстом відповіді,
Об’єкт `response`, повернутий із `fetch`, також має метод `response.json()`, який парсить отриманий текст і зберігає його у форматі JSON. У нашому випадку він ще зручніший чим метод `response.text()`, тому далі будемо користуватись ним.
255
+
Об’єкт `response`, повернутий із `fetch`, також має метод `response.json()`, який обробляє отриманий текст і зберігає його у форматі JSON. У нашому випадку він ще зручніший за метод `response.text()`, тому далі будемо використовувати саме його.
259
256
260
257
Ми також будемо використовувати стрілкові функції для стислості:
Тобто обробник `.then` у рядку `(*)` тепер повертає `new Promise`, який перейде у стан "виконаний" лише після виклику `resolve(githubUser)` у `setTimeout``(**)`. Наступний `.then` в ланцюжку буде чекати цього.
326
323
327
-
Гарним тоном буде писати код так, щоб асинхронна дія завжди повертала проміс. Це даватиме можливість іншим програмістам після вас планувати наступні дії після тієї асинхронної дії; навіть якщо ми не плануємо розширювати ланцюжок зараз, можливо, це нам знадобиться пізніше.
324
+
Гарним тоном буде писати код так, щоб асинхронна дія завжди повертала проміс. Це дає можливість іншим програмістам після вас планувати наступні дії, які зможуть почекати завершення попередньої; навіть якщо ми не плануємо розширювати ланцюжок зараз, можливо, це нам знадобиться пізніше.
328
325
329
326
Ну а зараз ми можемо розділити код на функції, що можуть бути перевикористані:
0 commit comments