Что такое Promise в JavaScript/Node.js?

«Что такое Promise в JavaScript/Node.js?» — вопрос из категории Асинхронность, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Promise (Обещание) — это объект в JavaScript, представляющий результат (успешный или неудачный) асинхронной операции, которая завершится в будущем. Он является фундаментальной частью работы с асинхронностью в Node.js.

Состояния Promise:

  • pending (ожидание): Начальное состояние, операция еще не завершена.
  • fulfilled (выполнено): Операция завершилась успешно. Promise переходит в это состояние при вызове resolve(value).
  • rejected (отклонено): Операция завершилась с ошибкой. Promise переходит в это состояние при вызове reject(error).

Пример создания и использования:

const readFileAsync = (filename) => {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf8', (err, data) => {
            if (err) {
                reject(new Error(`Failed to read file: ${err.message}`));
            } else {
                resolve(data);
            }
        });
    });
};

// Использование с цепочкой .then() и .catch()
readFileAsync('config.json')
    .then(data => {
        console.log('File content:', data);
        return JSON.parse(data);
    })
    .then(config => console.log('DB Host:', config.dbHost))
    .catch(error => console.error('Error:', error.message));

Ключевые преимущества для Node.js:

  • Избегание "Callback Hell": Позволяет структурировать асинхронный код более линейно и читаемо.
  • Цепочки вызовов: Методы .then() всегда возвращают новый Promise, что позволяет строить последовательности асинхронных операций.
  • Централизованная обработка ошибок: Все ошибки в цепочке можно перехватить одним блоком .catch() в конце.
  • Интеграция с async/await: Promise — основа для синтаксиса async/await, который делает асинхронный код похожим на синхронный.

Статические методы для работы с коллекциями Promise:

  • Promise.all([p1, p2]): Ждет выполнения всех промисов. Если один отклоняется — вся операция отклоняется.
  • Promise.allSettled([p1, p2]): Ждет завершения всех промисов (успех или ошибка) и возвращает массив с результатами каждого.
  • Promise.race([p1, p2]): Возвращает результат первого завершившегося промиса (fulfilled или rejected).

Видео-ответы