JavaScript: Обробка помилок

Помилки в асинхронному коді

📖 Теорія

Обробка помилок у Promise та async/await:

💡 Приклад коду
Вивід:

                            
📝 ЗАВДАННЯ (3)
1.
Завдання 1: Promise з помилкою
10 XP
Створи функцію fetchWithTimeout(ms) що:
- повертає Promise
- через ms мілісекунд резолвиться з 'Дані отримано'
- якщо ms > 100 — reject з Error('Timeout')

Виклич для 50 та 200, обробни через .then/.catch.
💡 Підказка: new Promise((resolve, reject) => { if (ms > 100) reject(...); else setTimeout(() => resolve(...), ms); })
🔓 Розв'язок:
function fetchWithTimeout(ms) {
  return new Promise((resolve, reject) => {
    if (ms > 100) return reject(new Error('Timeout'));
    setTimeout(() => resolve('Дані отримано'), ms);
  });
}
fetchWithTimeout(50)
  .then(d => console.log(d))
  .catch(e => console.log('Помилка:', e.message));
fetchWithTimeout(200)
  .then(d => console.log(d))
  .catch(e => console.log('Помилка:', e.message));
Вивід:

                                

2.
Завдання 2: async/await try/catch
20 XP
Напиши async функцію processItems(items) що:
- для кожного item викликає async validate(item) яка кидає Error якщо item < 0
- збирає успішні та невдалі результати
- виводить: 'Успішно: [список]' та 'Помилки: [кількість]'

Виклич з [5, -2, 8, -1, 3].
💡 Підказка: Використай for...of з try/catch всередині циклу для кожного item
🔓 Розв'язок:
async function validate(item) {
  if (item < 0) throw new Error(`${item} від'ємне`);
  return item * 2;
}
async function processItems(items) {
  const good = [], bad = [];
  for (const item of items) {
    try { good.push(await validate(item)); }
    catch (e) { bad.push(e.message); }
  }
  console.log(`Успішно: ${good}`);
  console.log(`Помилки: ${bad.length}`);
}
processItems([5, -2, 8, -1, 3]);
Вивід:

                                

3.
Завдання 3: Promise.allSettled
30 XP
Є масив чисел: [4, 0, 9, -1, 16]. Створи Promise для кожного:
- якщо число > 0 → resolve(Math.sqrt(n).toFixed(2))
- якщо число <= 0 → reject(Error('Неможливо взяти корінь'))

Використай Promise.allSettled та виведи кожен результат: 'OK: [value]' або 'FAIL: [reason]'.
💡 Підказка: Promise.allSettled повертає [{status:'fulfilled',value}, {status:'rejected',reason}]
🔓 Розв'язок:
const nums = [4, 0, 9, -1, 16];
const promises = nums.map(n =>
  n > 0 ? Promise.resolve(Math.sqrt(n).toFixed(2)) : Promise.reject(new Error('Неможливо взяти корінь'))
);
Promise.allSettled(promises).then(results => {
  results.forEach(r => {
    if (r.status === 'fulfilled') console.log(`OK: ${r.value}`);
    else console.log(`FAIL: ${r.reason.message}`);
  });
});
Вивід: