Избегаем антипаттерн явной конструкции обещаний в JS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Антипаттерн явной конструкции промиса в JavaScript можно избежать, если не оборачивать в новый Promise те функции, которые уже возвращают Promise.

JS
Скопировать код
// Пример излишнего использования промиса 🚧
new Promise((resolve, reject) => {
  asyncFunction().then(resolve).catch(reject);
});

// Верно ли это? Да, потому что это избыточно.

Оптимальный вариант будет выглядеть так:

JS
Скопировать код
// Чисто и лаконично 🍋 
asyncFunction();
// Нет необходимости усложнять, если у вас уже есть готовое решение.

Таким образом сокращается сложность кода и уменьшается использование промисов.

Кинга Идем в IT: пошаговый план для смены профессии

Основные принципы для избежания ловушки явной конструкции промиса

Чтобы не угодить в ловушку явной конструкции промиса, следуйте нескольким рекомендациям:

1. Придерживайтесь цепочки промисов

Использование методов.then() и .catch() позволяет избежать излишней запутанности кода, делая его более лёгким и понятным.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

2. Передавайте полученный промис

Если функция уже возвращает Promise, то просто передайте этот промис, вместо создания нового.

3. Объекты отложенного выполнения: используйте с осторожностью

Объекты Deferred лучше использовать только в случаях, когда это действительно необходимо – когда, например, требуется преобразовать API, не работающее с промисами, в совместимые.

4. Async/await для простоты и понятности кода

Оформление кода с помощью async/await делает его чище и проще, особенно если его дополнить try/catch блоками для обработки ошибок.

Визуализация

Вот как выглядит антипаттерн явной конструкции промиса:

JS
Скопировать код
// Антипаттерн: использование ракеты для ловли мухи 🚀🦟
new Promise((resolve, reject) => {
    fs.readFile('file.txt', (err, data) => {
        if (err) reject(err);
        else resolve(data);
    });
});

Лучший подход:

JS
Скопировать код
// Эффективный подход: мухобойка 🪰
const readFilePromise = util.promisify(fs.readFile);
readFilePromise('file.txt');

То есть, старайтесь использовать специализированные инструменты и функции, предназначенные для асинхронных задач, а не заставлять работать "тяжелую артиллерию".

Глубже в тему: практика и нюансы

Разберем более подробно применение этих принципов и возникающие при этом последствия:

1. Работа со сторонними библиотеками

При разработке с использованием сторонних библиотек сначала внимательно изучите их API и возможности. Если вы работаете с открытым кодом, то поищите способы связи с их авторами.

2. Композиция вместо создания

Если вы работаете с промисами, думайте о них как о деталях конструктора: вы можете сочетать их, но не должны создавать каждый раз с нуля.

3. Сотрудничество и взаимодействие

В случае трудностей на пути разработки, обратитесь за помощью к коллегам программистам или соответствующему сообществу.

4. Адаптация API к промисам

Для того чтобы преобразовывать библиотеки, работающие с обратными вызовами (callback), в API на основе промисов, используйте готовые решения, такие как util.promisify.

5. Поддержание кода в актуальном состоянии

Регулярный рефакторинг и обновление асинхронного кода обеспечивают его легкочитаемость и уменьшают сложность.

Продвинутые техники работы с промисами

Приведём примеры некоторых продвинутых методов использования промисов для правильного управления сложными асинхронными процессами:

1. Группировка с помощью Promise.all

Promise.all можно использовать для запуска и ожидания выполнения нескольких промисов параллельно.

2. Последовательное выполнение с использованием цепочки промисов

С использованием цепочки промисов можно последовательно выполнять асинхронные задачи, одну за другой.

3. Централизованное управление ошибками

Цепочки промисов предоставляют возможность эффективного управления ошибками, что упрощает отладку кода.

Полезные материалы

  1. Promise – JavaScript | MDN — подробная документация по работе с Promise в JavaScript.
  2. ECMAScript 2015 Language Specification – ECMA-262 6th Edition — официальная спецификация ECMAScript для Promise.
  3. JavaScript Promises: an introduction | Articles | web.dev — вводная статья по работе с промисами в JavaScript.
  4. javascript – What is the explicit promise construction antipattern and how do I avoid it? – Stack Overflow — обсуждение способов избегания антипаттерна явной конструкции промиса.
  5. ES6 Promises in Depth — глубокое погружение в мир промисов на ES6.
  6. Promises/A+ — открытый стандарт с описанием промисов в JavaScript.
  7. Understanding Asynchronous JavaScript | by Sukhjinder Arora | Bits and Pieces — статья о понимании асинхронности в JavaScript.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как избежать антипаттерна явной конструкции промиса в JavaScript?
1 / 5