Вступление Node.js — крут во многом благодаря своей способности не тормозить выполнение, работая с задачами асинхронно. Но как разобраться с этой асинхронностью? Если в примере с сервером мы обошлись простым колбэком, то в реальной жизни обычно хочется чего-то помощнее. Щас посмотрим, как развивался асинхронный код: от колбэчного ада до классных промисов и удобного async/await. Проблема ад колбэков: // Классическая проблема вложенных колбэков readFile('file1.txt', (err, data1) => { if (err) throw err; readFile('file2.txt', (err, data2) => { if (err) throw err; writeFile('result.txt', data1 + data2, (err) => { if (err) throw err; console.log('Готово!'); }); }); }); Решение 1: Промисы (Promises) Промисы – это штуки, которые показывают, чем закончилась асинхронная операция (успехом или провалом). Что важно знать: Состояния: pending (в процессе), fulfilled (готово), rejected (отклонено) Методы: .then() – для обработки успехов, .catch() – для ловли ошибок Цепочки: позволяют выполнять асинхр