From 0af48efc8aafba5bb4996e9b478858dfe8a003b8 Mon Sep 17 00:00:00 2001 From: Andrii Hrushetskyi Date: Wed, 26 Feb 2025 13:18:00 +0100 Subject: [PATCH 1/2] fixed typos and simplified explanation **In chapter 01-11-02 promise-basics** Some of sentences were correct, but they were "unnatural" in Ukrainian and make understanding more difficult. --- 1-js/11-async/02-promise-basics/article.md | 116 ++++++++++-------- .../02-promise-basics/promise-reject-1.svg | 2 +- .../02-promise-basics/promise-resolve-1.svg | 2 +- .../promise-resolve-reject.svg | 2 +- 4 files changed, 66 insertions(+), 56 deletions(-) diff --git a/1-js/11-async/02-promise-basics/article.md b/1-js/11-async/02-promise-basics/article.md index f72c210a3..90a8970a7 100644 --- a/1-js/11-async/02-promise-basics/article.md +++ b/1-js/11-async/02-promise-basics/article.md @@ -1,42 +1,52 @@ # Проміси -Уявіть, що ви топ співак, фани якого постійно дошкуляють запитаннями про майбутній сингл. +Уявіть, що ви співак-суперзірка і ваші фани постійно дошкуляють запитаннями про майбутній сингл. -Щоб отримати передишку, ви обіцяєте розіслати їм сингл, коли він буде випущений. Ви даєте своїм фанатам список. В який вони можуть записати свій e-mail, на який вони отримають пісню як тільки вона вийде. І навіть якщо щось піде не так, наприклад, в студії станеться пожежа і ви не зможете випустити пісню, вони й про це отримають сповіщення. +Щоб вони перестали вам набридати, ви обіцяєте розіслати їм сингл як тільки-но він буде випущений. Ви даєте своїм фанатам листочок, в який вони можуть вписати свій e-mail. На який вони отримають або пісню як тільки-но вона буде готова, або ж, якщо щось піде не так (до прикладу якщо вас запакує ТЦК), то отримають сповіщення, що пісні взагалі не буде. -Всі щасливі: ви, тому що вам більше не дошкуляють, а фанати, тому що можуть більше не переживати що пропустять новий сингл. +Всім добре: ви, бо вам більше не дошкуляють, а фанати, бо можуть більше не переживати, що пропустять новий сингл. Це аналогія з реального життя для ситуацій з якими ми часто стикаємось в програмуванні: -1. Є код–"виробник", котрий щось робить, що займає час. Наприклад, завантажує дані з мережі. Згідно з нашою аналогією це "співак". -2. Є код–"споживач", котрий очікує отримати результат від коду-"виробника", як тільки той буде готовий. Цей результат може знадобитися багатьом функціям. Ці функції -- "фанати" -3. *Promise* (надалі будемо називати такий об’єкт промісом) -- це спеціальний об’єкт в JavaScript, котрий зв’язує код-"виробника" і "споживача" разом. В контексті нашої аналогії -- це "список підписки". Код-"виробник" виконується стільки часу, скільки потрібно щоб отримати результат, а проміс -- як тільки результат готовий, робить його доступним для коду який підписався на конкретний проміс. +1. Є код–"виробник", котрий робить щось, що займає час. Наприклад, завантажує дані з мережі. Згідно з нашою аналогією це "співак". +2. Є код–"споживач", котрий очікує отримати результат від коду-"виробника", як тільки-но результат буде готовий. Цей результат може знадобитися багатьом функціям. Ці функції -- "фанати" +3. *Проміс* (англ. Promise) -- це спеціальний об’єкт в JavaScript, котрий зв’язує "виробника" і "споживача" разом. В контексті нашої аналогії -- це "список підписників". Код-"виробник" виконується стільки часу, скільки потрібно щоб отримати результат, а проміс робить результат доступним для коду-"споживача", який на нього підсився, як тільки-но код-"виробник" поверне результат. -Аналогія не зовсім точна, оскільки реалізація промісів в JavaScript набагато складніша ніж простий список підписок: вони володіють додатковими можливостями й обмеженнями. Але для початку варто почати з простішого. +Аналогія не зовсім точна, оскільки реалізація промісів в JavaScript набагато складніша ніж простий список підписок. В промісів більше можливостей і обмежень. Але для початку варто почати з простішого. Синтаксис створення проміса: ```js let promise = new Promise(function(resolve, reject) { - // код, котрий поверне результат (код–"виробник", "співак") + // код, котрий поверне результат (по аналогії код–"виробник", код-"співак") }); ``` -Функція передана в `new Promise` називається *виконавцем*. Коли створюється `new Promise` вона виконується автоматично. В ній знаходиться код "виробник" котрий зрештою поверне результат. В контексті нашої аналогії: виконавець -- це "співак". +Функція передана в `new Promise` називається *виконавцем*. Коли створюється `new Promise` вона запускається автоматично. В ній знаходиться код "виробник" котрий зрештою поверне результат. В контексті нашої аналогії: виконавець -- це "співак". -Його аргументи `resolve` і `reject` -- це колбеки які надає нам сам JavaScript. Наш код -- тільки всередині виконавця. +Аргументи функції виконавця `resolve` і `reject` -- це колбеки, які надає сам JavaScript. Наш код має бути тільки всередині функції виконавця. -Коли функція-виконавець завершить свою роботу, неважливо -- зараз чи пізніше, вона повинна викликати один з цих колбеків: +Після завершення своєї роботи функція виконавець повинна викликати один з цих колбеків: -- `resolve(value)` -- якщо код успішно виконався, з результатом `value`. -- `reject(error)` -- якщо виникла помилка, `error` -- об’єкт помилки. +- `resolve(value)` -- якщо код успішно виконався, з результатом `value`. (resolve перекладається як вирішити, розв'язати) +- `reject(error)` -- якщо виникла помилка, `error` -- об’єкт помилки. (reject в перекладі відхилити, відмовити) -Отже, виконавець запускається автоматично і намагається виконати роботу. А потім викликає метод `resolve` якщо спроба була успішною або `reject` якщо виникла помилка. +Отже, функція виконавець запускається автоматично і намагається виконати роботу. А потім викликає перший аргумент (`resolve`) якщо спроба була успішною чи другий аргумент (`reject`) якщо виникла помилка. -В об’єкта `promise`, що повертається конструктором `new Promise` є внутрішні властивості: +`new Promise` повертає об'єкт `promise`. В цього об'єкта є дві властивості: `state` і `result`: +- `state` - спочатку має значення `"pending"` (очікування). А далі значення змінюється або на `"fulfilled"` якщо функція виконавець викликала аргумент `resolve`, або на `"rejected"`, якщо функція виконавець викликала `reject`. +- `result` - спочатку має значення `undefined`. А далі значення змінюється або на `value` якщо функція-виконавець викликала `resolve(value)`, або ж на `error`, якщо функція виконавець викликала `reject(error)`. -- `state` (стан) — спочатку `"pending"` (очікування), в результаті виконання функції він може змінюватися на: `"fulfilled"` коли викликається метод `resolve` і на `"rejected"` коли `reject`. -- `result` (результат) — спочатку `undefined`, далі змінюється на `value` коли викликається метод `resolve(value)` або `error` коли `reject(error)`. +````smart header="Словничок англійських слів" +promise - обіцянка; +resolve - розв'язувати, вирішувати; +value - значення, вміст; +fulfilled - виконаний, здійснений; +reject - відхиляти, скасовувати; +error - помилка; +rejected - відхилений, скасований; +settled - усталений, завершений, втихомирений; +```` Отже, виконавець зрештою переводить `promise` в один з наступних станів: @@ -58,15 +68,15 @@ let promise = new Promise(function(resolve, reject) { Ми можемо спостерігати за двома моментами запустивши код вище: 1. Функція-виконавець викликається одразу ж при виклику `new Promise`. -2. Виконавець отримує два аргументи: `resolve` і `reject` -- ці функції вбудовані в JavaScript, тому нам непотрібно їх створювати. Нам слід всього лиш викликати одну з них по готовності. +2. Функція-виконавець отримує два аргументи: `resolve` і `reject` -- ці функції вбудовані в JavaScript, тому нам непотрібно їх створювати. Нам слід всього лиш викликати одну з них по готовності. - Через одну секунду "обробки" виконавець викличе `resolve("done")`, щоб передати результат. Ця дія змінить стан об’єкта `promise` (що повертається конструктором `new Promise`) з `"pending"` на `"fulfilled"`: + Через одну секунду "обробки" виконавець викличе `resolve("done")`, щоб передати результат. Ця дія змінить стан об’єкта `promise` (що був створений конструктором `new Promise`) з `"pending"` на `"fulfilled"`: ![](promise-resolve-1.svg) Це був приклад успішно виконаної задачі, в результаті ми отримали "виконаний (fulfilled)" проміс. -А тепер приклад коли функція-виконавець повідомить нам що задача виконана з помилкою: +А ось приклад коли функція-виконавець повідомить нам, що задача виконана з помилкою: ```js let promise = new Promise(function(resolve, reject) { @@ -75,18 +85,18 @@ let promise = new Promise(function(resolve, reject) { }); ``` -Виклик методу `reject(...)` переводить стан об’єкта `promise` в `"rejected"`: +Виклик першого аргумента (`reject(...)`) переводить стан об’єкта `promise` в `"rejected"`: ![](promise-reject-1.svg) -Підіб’ємо проміжні підсумки: функція-виконавець виконує задачу (щось, що як правило потребує часу), потім викликається один з методів `resolve` чи `reject`, в залежності від успішності виконання коду. Які своєю чергою змінюють стан об’єкта який повертає конструктор `new Promise`. +Підіб’ємо проміжні підсумки: функція-виконавець виконує задачу (щось, що як правило потребує часу), потім викликається один з методів `resolve` чи `reject`, в залежності від успішності виконання коду. Які своєю чергою змінюють стан об’єкта який був повернутий з конструктора `new Promise`. -Проміс -- в стані `resolve` чи `reject` будемо називати "завершеним (settled)", на відміну від початкового стану проміса "в очікуванні (`pending`)". +Проміс -- в стані `resolve` чи `reject` будемо називати "завершеним" (англ. settled), на відміну від початкового стану проміса "в очікуванні" (англ. pending). -````smart header="Може бути тільки щось одне: або результат або помилка" -Функція-виконавець може викликати тільки щось одне: `resolve` або `reject`. Стан проміса може змінитись лише один раз. +````smart header="Може бути тільки щось одне: або результат, або помилка" +Функція-виконавець повинен викликати тільки щось одне: `resolve` або `reject`. Стан проміса може бути змінений лише один раз. -Всі наступні виклики `resolve` чи `reject` будуть ігноруватись: +Всі наступні виклики `resolve` чи `reject` будуть проігноровані: ```js let promise = new Promise(function(resolve, reject) { @@ -99,37 +109,37 @@ let promise = new Promise(function(resolve, reject) { }); ``` -Ідея в тому, що функція виконавець може мати тільки один результат чи помилку. +Ідея в тому, що функція виконавець може мати тільки один результат: або успішний результат, або помилку. -Зверніть увагу, що методи `resolve`/`reject` можуть прийняти тільки один аргумент (або жодного), а всі додаткові аргументи будуть проігноровані. +Зверніть увагу, що методи `resolve`/`reject` можуть прийняти тільки один аргумент (або жодного) й ігнорують всі інші аргументи. ```` ```smart header="Викликайте `reject` з об’єктом `Error`" -У випадку якщо щось пішло не так, функції-виконавцю слід викликати метод `reject`. В `reject` можна передати аргумент будь-якого типу (як і в `resolve`), але рекомендується використовувати об’єкт `Error` (чи успадкований від нього об’єкт). Чому так? Скоро вам стане зрозуміло. +У випадку якщо щось пішло не так, функції-виконавцю слід викликати другий аргумент (`reject`). В `reject` можна передати аргумент будь-якого типу (як і в `resolve`), але рекомендується використовувати об’єкт `Error` (чи успадкований від нього об’єкт). Чому так? Скоро вам стане зрозуміло. ``` ````smart header="Негайний виклик `resolve`/`reject`" -На практиці функція-виконавець робить щось асинхронне і через якийсь час викликає `resolve`/`reject`. Проте це необов’язково. `resolve` чи `reject` можуть викликатись одразу: +На практиці функція-виконавець робить щось асинхронне і викликає `resolve`/`reject` через деякий час. Проте можна викликати `resolve` чи `reject` одразу і це теж працюватиме: ```js let promise = new Promise(function(resolve, reject) { - // задача що не потребує часу + // задача, що не потребує часу resolve(123); // моментально видасть результат: 123 }); ``` -Для прикладу, таке може статись коли ми почали виконувати певну задачу, проте одразу ж побачили що раніше її виконували й результат закешований. +Для прикладу, таке може статись коли JavaScript почав виконувати певну задачу, проте одразу ж побачив, що раніше її виконували й результат закешований. -Така ситуація нормальна. Ми одразу ж отримаємо успішно завершений проміс. +Така ситуація нормальна. Проміс стає завершеним одразу ж. ```` ```smart header="Властивості `state` і `result` -- внутрішні" -Властивості `state` and `result` -- внутрішні властивості об’єкта `Promise`, тому ми не маємо до них прямого доступу. Для обробки результату слід використовувати методи: `.then`/`.catch`/`.finally`. Про них далі піде мова. +Властивості `state` і `result` -- це внутрішні / вбудовані / "підкапотні" властивості об’єкта створюваного конструтором Promise. Вони є "під капотом", але ми не маємо до них прямого доступу. Для обробки результату слід використовувати методи: `.then`/`.catch`/`.finally`. Про них піде мова далі. ``` ## Споживачі: then, catch -Об’єкт `Promise` служить зв’язною ланкою між функцією виконавцем (код "виробник" чи "співак") і функціями-споживачами ("фанатами"), котрі отримають або результат, або помилку. Функції споживачі можуть зареєструватись (підписатись) за допомогою методів `.then` та `.catch`. +Об’єкт, створюваний конструтором `Promise`, служить зв’язною ланкою між функцією виконавцем (код "виробник" чи "співак") і функціями-споживачами ("фанатами"), котрі отримають або результат, або помилку. Функції-споживачі можна зареєструвати (підписати на розсилку) за допомогою методів `.then` та `.catch`. ### then @@ -144,9 +154,9 @@ promise.then( ); ``` -Перший аргумент метода `.then` -- функція що викликається коли проміс успішно виконується, тобто переходить зі стану `"pending"` в `"resolved"` і отримує результат. +Перший аргумент метода `.then` -- це функція, що викликається коли проміс успішно виконується, тобто тоді, коли `state` переходить зі стану `"pending"` в `"resolved"`. Ця функція аргументом отримує результат проміса. -Другим аргументом метод `.then` приймає функцію, що викликається коли проміс переходить в стан `"rejected"` і отримує помилку. +Другим аргументом метод `.then` приймає функцію, що викликається коли проміс переходить в стан `"rejected"`. Ця функція аргументом отримує помилку. Для прикладу, наступним чином виглядає реакція на успішно виконаний проміс: @@ -155,16 +165,16 @@ let promise = new Promise(function(resolve, reject) { setTimeout(() => resolve("завершено!"), 1000); }); -// метод resolve запустить першу функцію передану в .then +// після запуску resolve запуститься перший аргумент в .then promise.then( *!* result => alert(result), // виведе "завершено!" через 1 секунду */!* - error => alert(error) // не запуститься + error => alert(error) // не запуститься ніколи ); ``` -Функція передана першим аргументом виконалась. +Тут запустилась перша функція. А в випадку помилки в промісі - виконається друга: @@ -175,7 +185,7 @@ let promise = new Promise(function(resolve, reject) { // метод reject запустить другу функцію передану в .then promise.then( - result => alert(result), // не запуститься + result => alert(result), // не запуститься ніколи *!* error => alert(error) // виведе "Error: Ооооой!" через 1 секунду */!* @@ -196,7 +206,7 @@ promise.then(alert); // виведе "завершено!" через 1 секу ### catch -Якби ми хотіли лише обробити помилку, тоді ми могли б використати `null` як перший аргумент `.then(null, errorHandlingFunction)`. Або можемо скористатись методом `.catch(errorHandlingFunction)`, котрий зробить те ж саме: +Якби ми хотіли обробити лише помилку, тоді ми можемо використати `null` як перший аргумент `.then(null, errorHandlingFunction)`. Або можемо скористатись методом `.catch(errorHandlingFunction)`, котрий зробить те ж саме: ```js run @@ -216,13 +226,13 @@ promise.catch(alert); // виведе "Error: Ооооой!" через 1 сек По аналогії з блоком `finally` зі звичайного `try {...} catch {...}`, у промісів також є свій метод `finally` -Виклик `.finally(f)` подібний до `.then(f, f)`, в тому сенсі, що `f` виконається в будь-якому випадку, коли проміс перейде в стан `"виконано (settled)"` не залежно від того став він `resolved` чи `rejected`. +Виклик `.finally(f)` подібний до `.then(f, f)`, в тому сенсі, що `f` виконається в будь-якому випадку, коли проміс перейде в стан `"виконано (settled)"`. Як у випадку якщо стан проміса стане `resolved`, так і у випадку якщо `rejected`. `finally` добре підходить для чистки, наприклад зупинки індикатора завантаження, тому, що його потрібно зупинити незалежно від результату. Наприклад зупинка завантаження індикаторів, закриття непотрібних підключень тощо. -Подумайте про це як про завершення вечірки. Незалежно від того, була вечірка хорошою чи поганою, скільки друзів на ній було, ми все одно повинні (або принаймні повинні) прибрати після неї. +Подумайте про це як про завершення вечірки. Незалежно від того, була вечірка хорошою чи поганою, скільки друзів на ній було, ми все одно повинні прибрати по її завершенні. Код може виглядати так: @@ -240,9 +250,9 @@ new Promise((resolve, reject) => { Проте `finally(f)` точно не є псевдонімом `then(f,f)`. -Є декілька незначних відмінностей: +Є декілька важливих відмінностей: -1. Обробник `finally` не приймає аргументів. В `finally` ми не знаємо як був завершений проміс, успішно чи ні. І це нормально, тому що зазвичай наше завдання заключаєтсья в тому щоб виконати "загальні" процедури доопрацювання. +1. Обробник `finally` не приймає аргументів. В `finally` ми не знаємо як був завершений проміс, успішно чи ні. І це нормально, тому що зазвичай наше завдання полягає в тому щоб виконати "загальні" процедури по завершенню. Подивіться на наведений вище приклад: як бачите, обробник `finally` не має аргументів, а результат промісу обробляється наступним обробником. 2. Обробник `finally` пропускає результат чи помилку до наступних обробників. @@ -258,7 +268,7 @@ new Promise((resolve, reject) => { Як бачите, "результат", який повертає перший проміс, передається через `finally` наступному `then`. - Це дуже зручно, оскільки `finally` не призначено для обробки результату промісу. Як було сказано, це місце для загального очищення, незалежно від результату. + Це дуже зручно, оскільки `finally` не призначений для обробки результату промісу. Як було сказано, це метод для загального очищення, незалежно від результату. А ось приклад помилки, щоб ми могли побачити, як вона передається через `finally` до `catch`: @@ -270,14 +280,14 @@ new Promise((resolve, reject) => { .catch(err => alert(err)); // <-- .catch обробляє об’єкт помилки ``` -3. Обробник `finally` також не повинен нічого повертати. Якщо все ж таки він щось повертає, це значення ігнорується. +3. Функція-обробник `f` з `.finally(f)` також не повинна нічого повертати. А навіть якщо вона щось і повертає, це значення всодно буде проігнороване. - Єдиним винятком із цього правила є випадки, коли обробник `finally` видає помилку. А потім ця помилка переходить до наступного обробника замість будь-якого попереднього результату проміса. + Єдиним винятком із цього правила є випадки, коли функція-обробник `finally` видає помилку. В такій ситуації помилка переходить до наступної функції-обробника замість будь-якого попереднього результату проміса. У підсумку: -- Обробник `finally` не отримує результат попереднього обробника (у нього немає аргументів). Замість цього цей результат передається наступному відповідному обробнику. -- Якщо обробник `finally` щось повертає, це буде ігноруватися. +- Функція обробник `f` з `.finally(f)` не отримує результат попередньої функції обробника (у нього немає аргументів). Замість цього цей результат передається наступному відповідному обробнику. +- Якщо функція обробник `f` в `.finally(f)` щось повертає, це значення буде проігнороване. - Якщо виникає помилка в `finally`, виконання переходить до найближчого обробника помилок. Ці особливості є корисними й забезпечують правильну роботу, якщо ми використовуємо `finally` так, як це передбачено: для загальних процедур очищення. @@ -285,7 +295,7 @@ new Promise((resolve, reject) => { ````smart header="На завершених промісах обробники запускаються одразу" Якщо проміс в стані очікування, `.then/catch/finally` будуть на нього чекати. -Іноді може бути так, що проміс уже виконано, коли ми додаємо до нього обробник. +Іноді може бути й таке, що проміс стане виконаним ще до того, як ми додамо до нього обробник. У такому випадку ці обробники просто запускаються негайно: @@ -357,7 +367,7 @@ promise.then(script => alert('Ще один обробник...')); | Проміси | Колбеки | |----------|-----------| -| Проміси дозволяють нам виконувати речі в природному порядку. Спочатку ми запускаємо `loadScript(script)`, і потім ми записуємо в `.then` що робити з результатом. | У нас повинна бути функція `callback` на момент виклику `loadScript(script, callback)`. Іншими словами нам потрібно знати що робити з результатом *до того* як викличеться `loadScript`. | +| Проміси дозволяють нам виконувати речі в природному порядку. Спочатку ми запускаємо `loadScript(script)`, і потім ми прописуємо в `.then` що робити з результатом. | У нас повинна бути функція `callback` на момент виклику `loadScript(script, callback)`. Іншими словами нам потрібно знати що робити з результатом *до того* як викличеться `loadScript`. | | Ми можемо викликати `.then` у проміса стільки раз, скільки захочемо. Кожного разу коли ми додаємо нового "фаната", нову функцію-підписку в "список-підписників". Більше про це в наступному розділі: [ланцюжок промісів](info:promise-chaining). | Колбек може бути тільки один. | Таким чином проміси покращують порядок коду і дають нам гнучкість. Але це далеко не все. Ми дізнаємось ще багато корисного в наступних розділах. diff --git a/1-js/11-async/02-promise-basics/promise-reject-1.svg b/1-js/11-async/02-promise-basics/promise-reject-1.svg index 777e47739..a49df98c6 100644 --- a/1-js/11-async/02-promise-basics/promise-reject-1.svg +++ b/1-js/11-async/02-promise-basics/promise-reject-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file +new Promise(функція виконавець)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-1.svg b/1-js/11-async/02-promise-basics/promise-resolve-1.svg index f1f34eaee..d67386e30 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-1.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file +new Promise(функція виконавець)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg index 80593a3a4..417b501c6 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file +new Promise(функція виконавець)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file From 8849143e46ad41fd947b085743acad9898aa3477 Mon Sep 17 00:00:00 2001 From: Andrii Hrushetskyi Date: Sun, 9 Mar 2025 19:51:10 +0100 Subject: [PATCH 2/2] fixed spaces in illustration --- 1-js/11-async/02-promise-basics/promise-resolve-reject.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg index 417b501c6..048cd1f6b 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg @@ -1 +1 @@ -new Promise(функція виконавець)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file +new Promise(функціяВиконавець);state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file