Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Promise.all()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Promise.all()`** - це метод класу `Promise`, який приймає масив (або будь-який ітерований об'єкт) промісів і повертає новий проміс, що виконується успішно, коли всі проміси всередині масиву успішно завершилися, або відхиляється, щойно перший проміс завершився з помилкою. **Ключове:** результатом успіху є масив результатів у тому ж порядку, що й вхідні проміси, а перше відхилення миттєво відхиляє весь `Promise.all()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що робить `Promise.all()` `Promise.all()` - це **метод класу** `Promise`, який приймає масив (або будь-який ітерований об'єкт) промісів і **повертає новий проміс**, який: - **виконується успішно**, коли **всі проміси** всередині масиву успішно завершилися (`fulfilled`); - **відхиляється (rejected)**, щойно **перший проміс** завершився з помилкою. --- ## Синтаксис ```javascript Promise.all(iterable) ``` де `iterable` - це, як правило, масив промісів: ```javascript const p1 = Promise.resolve('A'); const p2 = Promise.resolve('B'); const p3 = Promise.resolve('C'); Promise.all([p1, p2, p3]).then(values => console.log(values)); ``` **Результат:** ```javascript ["A", "B", "C"] ``` --- ## Як це працює 1. Всі проміси всередині `Promise.all([...])` **запускаються паралельно**. (точніше - вони починають виконуватися *незалежно один від одного*). 2. `Promise.all()` **чекає** на їх завершення. 3. Якщо всі успішні -> повертається новий проміс у стані `fulfilled`, і його значення - це **масив результатів у тому самому порядку**, що й вхідні проміси. --- ## Приклад із затримками ```javascript const p1 = new Promise(res => setTimeout(() => res('Перший'), 1000)); const p2 = new Promise(res => setTimeout(() => res('Другий'), 2000)); const p3 = new Promise(res => setTimeout(() => res('Третій'), 500)); Promise.all([p1, p2, p3]) .then(results => console.log('Результати:', results)) .catch(err => console.error('Помилка:', err)); ``` Вивід приблизно через 2 секунди: ```javascript Результати: [ 'Перший', 'Другий', 'Третій' ] ``` Зверни увагу: результати **в тому самому порядку**, у якому були передані проміси, а не в порядку завершення. --- ## Що станеться, якщо один із промісів відхилиться Якщо **хоча б один** проміс всередині `Promise.all` перейде в стан **rejected**, то весь `Promise.all()` **негайно відхилиться**, і результатом буде **перша перехоплена помилка**. ### Приклад: ```javascript const p1 = Promise.resolve('OK'); const p2 = Promise.reject('Помилка!'); const p3 = Promise.resolve('Ще OK'); Promise.all([p1, p2, p3]) .then(results => console.log(results)) .catch(err => console.error(err)); ``` Вивід: ```javascript Помилка! ``` Решта промісів (`p3`) все одно виконаються, але **результати ігноруються**, оскільки `Promise.all()` вже перейшов у стан **rejected**. --- ## Важливо: результати зберігаються в порядку передачі Навіть якщо один проміс виконується довше, результати будуть упорядковані **за позицією**: ```javascript Promise.all([ Promise.resolve('A'), new Promise(res => setTimeout(() => res('B'), 2000)), Promise.resolve('C') ]).then(console.log); // ["A", "B", "C"] ``` --- ## Якщо передати не-проміси `Promise.all()` автоматично "обгортає" звичайні значення в `Promise.resolve()`: ```javascript Promise.all([42, Promise.resolve('OK')]) .then(console.log); // [42, "OK"] ``` --- ## Як обробити помилки, не перериваючи виконання Якщо потрібно, щоб **всі проміси виконалися незалежно**, і помилки **не переривали** виконання - використовуй `Promise.allSettled()`. ```javascript Promise.allSettled([ Promise.resolve('OK'), Promise.reject('Помилка'), Promise.resolve('Ще OK') ]).then(console.log); ``` Вивід: ```javascript [ { status: "fulfilled", value: "OK" }, { status: "rejected", reason: "Помилка" }, { status: "fulfilled", value: "Ще OK" } ] ``` `Promise.allSettled()` **ніколи не відхиляється**, і повертає масив результатів з полями `status` та `value`/`reason`. --- ## Проста аналогія > Уяви, що ти чекаєш 3 доставки: > > - `Promise.all()` - ти чекаєш **всі посилки одразу**. > Якщо хоча б одна **загубилася**, ти **скасовуєш усе**. > - `Promise.allSettled()` - ти чекаєш **на всі**, > навіть якщо одна **зламалася** - все одно отримуєш звіт про кожну. --- ## ПІДСУМОК | Метод | Що робить | Успіх | Помилка | |---|---|---|---| | `Promise.all()` | Чекає, поки всі проміси виконаються | Повертає масив результатів | Відхиляється при першій помилці | | `Promise.allSettled()` | Чекає на всі, навіть з помилками | Повертає масив об'єктів `{status, value/reason}` | - | | `Promise.race()` | Повертає результат **першого завершеного** промісу | Може бути успіх або помилка | - |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.