Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions 1-js/11-async/02-promise-basics/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

Уявіть, що ви топ співак, фани якого постійно дошкуляють запитаннями про майбутній сингл.

Щоб отримати передишку, ви обіцяєте розіслати їм сингл, коли він буде випущений. Ви даєте своїм фанатам список. В який вони можуть записати свій e-mail, на який вони отримають пісню як тільки вона вийде. І навіть якщо щось піде не так, наприклад, в студії станеться пожежа і ви не зможете випустити пісню, вони і про це отримають сповіщення.
Щоб отримати передишку, ви обіцяєте розіслати їм сингл, коли він буде випущений. Ви даєте своїм фанатам список. В який вони можуть записати свій e-mail, на який вони отримають пісню як тільки вона вийде. І навіть якщо щось піде не так, наприклад, в студії станеться пожежа і ви не зможете випустити пісню, вони й про це отримають сповіщення.

Всі щасливі: ви, тому що вам більше не дошкуляють, а фанати, тому що можуть більше не переживати що пропустять новий сингл.

Це аналогія з реального життя для ситуацій з якими ми часто стикаємось в програмуванні:

1. Є код–"виробник", котрий щось робить, що займає час. Наприклад, завантажує дані з мережі. Згідно з нашою аналогією це "співак".
2. Є код–"споживач", котрий очікує отримати результат від коду-"виробника", як тільки той буде готовий. Цей результат може знадобитися багатьом функціям. Це -- "фанати"
3. *Promise* (надалі будемо називати такий об’єкт промісом) -- це спеціальний об’єкт в JavaScript, котрий зв’язує код-"виробника" і "споживача" разом. В контексті нашої аналогії -- це "список підписки". Код-"виробник" виконується стільки часу, скільки потрібно щоб отримати результат, а проміс як тільки результат готовий, робить його доступним для коду який підписався на конкретний проміс.
2. Є код–"споживач", котрий очікує отримати результат від коду-"виробника", як тільки той буде готовий. Цей результат може знадобитися багатьом функціям. Ці функції -- "фанати"
3. *Promise* (надалі будемо називати такий об’єкт промісом) -- це спеціальний об’єкт в JavaScript, котрий зв’язує код-"виробника" і "споживача" разом. В контексті нашої аналогії -- це "список підписки". Код-"виробник" виконується стільки часу, скільки потрібно щоб отримати результат, а проміс -- як тільки результат готовий, робить його доступним для коду який підписався на конкретний проміс.

Аналогія не зовсім точна, оскільки реалізація промісів в JavaScript набагато складніша ніж простий список підписок: вони володіють додатковими можливостями і обмеженнями. Але для початку варто почати з простішого.
Аналогія не зовсім точна, оскільки реалізація промісів в JavaScript набагато складніша ніж простий список підписок: вони володіють додатковими можливостями й обмеженнями. Але для початку варто почати з простішого.

Синтаксис створення проміса:

Expand Down Expand Up @@ -99,7 +99,7 @@ let promise = new Promise(function(resolve, reject) {
});
```

Ідея в тому що функція виконавець може мати тільки один результат чи помилку.
Ідея в тому, що функція виконавець може мати тільки один результат чи помилку.

Зверніть увагу, що методи `resolve`/`reject` можуть прийняти тільки один аргумент (або жодного), а всі додаткові аргументи будуть проігноровані.
````
Expand Down Expand Up @@ -272,15 +272,15 @@ new Promise((resolve, reject) => {

3. Обробник `finally` також не повинен нічого повертати. Якщо все ж таки він щось повертає, це значення ігнорується.

Єдиним винятком із цього правила є випадки, коли обробник `finally` видає помилку. Бл потім ця помилка переходить до наступного обробника замість будь-якого попереднього результату проміса.
Єдиним винятком із цього правила є випадки, коли обробник `finally` видає помилку. А потім ця помилка переходить до наступного обробника замість будь-якого попереднього результату проміса.

To summarize:
У підсумку:

- A `finally` handler doesn't get the outcome of the previous handler (it has no arguments). This outcome is passed through instead, to the next suitable handler.
- If a `finally` handler returns something, it's ignored.
- When `finally` throws an error, then the execution goes to the nearest error handler.
- Обробник `finally` не отримує результат попереднього обробника (у нього немає аргументів). Замість цього цей результат передається наступному відповідному обробнику.
- Якщо обробник `finally` щось повертає, це буде ігноруватися.
- Якщо виникає помилка в `finally`, виконання переходить до найближчого обробника помилок.

These features are helpful and make things work just the right way if we use `finally` how it's supposed to be used: for generic cleanup procedures.
Ці особливості є корисними й забезпечують правильну роботу, якщо ми використовуємо `finally` так, як це передбачено: для загальних процедур очищення.

````smart header="На завершених промісах обробники запускаються одразу"
Якщо проміс в стані очікування, `.then/catch/finally` будуть на нього чекати.
Expand All @@ -305,7 +305,7 @@ promise.then(alert); // виведе "завершено!"

Тепер, розгляньмо декілька прикладів з тим як проміси можуть облегшити нам написання асинхронного коду.

В нас є функція `loadScript` для завантаження скрипта з попереднього розділу.
В нас є функція `loadScript` для завантаження скрипту з попереднього розділу.

Згадаймо як виглядає варіант з колбеком:

Expand All @@ -323,7 +323,7 @@ function loadScript(src, callback) {

Тепер перепишемо її використавши проміс.

Новій функції `loadScript` більше не потрібен колбек. Замість цього вона буде створювати і повертати об’єкт проміса, котрий перейде в стан "успішно завершений", коли завантаження завершиться. Зовнішній код також може додавати обробників ("підписників") використовуючи `.then`:
Новій функції `loadScript` більше не потрібен колбек. Замість цього вона буде створювати й повертати об’єкт проміса, котрий перейде в стан "успішно завершений", коли завантаження завершиться. Зовнішній код також може додавати обробників ("підписників") використовуючи `.then`:

```js run
function loadScript(src) {
Expand Down