Promises
Тема дорожной карты · Node.js
Promise — это нативный асинхронный примитив JavaScript в среде выполнения Node.js, представляющий конечное завершение или сбой асинхронной операции, заменяющий API на основе колбэков и составляющий основу синтаксиса async/await. Объект Promise находится в одном из трёх состояний — ожидание (pending), выполнено (fulfilled) или отклонено (rejected) — и переходы между состояниями необратимы, что делает Promise безопасными для совместного использования несколькими потребителями в серверных приложениях Node.js. Комбинаторы Promise.all(), Promise.allSettled(), Promise.race() и Promise.any() позволяют эффективно оркестрировать несколько конкурентных асинхронных операций, что необходимо для производительности сервисов Node.js, которым требуется параллельно получать данные из нескольких источников. Встроенная функция Node.js util.promisify() преобразует callback-API в стиле Node.js (где последний аргумент — (err, value) => void) в функции, возвращающие Promise, и многие встроенные модули теперь поставляются с вариантами promises напрямую (например, fs/promises, dns/promises). TypeScript улучшает использование Promise в Node.js с помощью обобщённых параметров типов (Promise<User>), распространяющих тип разрешённого значения через выражения await и цепочки .then(), что обеспечивает типобезопасность на этапе компиляции для асинхронной серверной разработки.
Как это работает
Promises — сердце Node: event loop libuv проходит фазы timers, pending I/O callbacks, idle/prepare, poll, check, close-callbacks. async/await — современный примитив; promises — механизм под капотом; callbacks — legacy. setImmediate запускается на следующей итерации; process.nextTick — до любого I/O, злоупотребление ломает loop. Worker threads (worker_threads) гонят JS параллельно; у них отдельные event loop, изолированная память, обмен сообщениями.
Когда применять
async/await — везде в новом коде; callbacks — для legacy или streams. Promise.all/allSettled — для параллельного I/O когда независимы. CPU-bound работа — в worker_threads или отдельный сервис; никогда не блокируйте main loop. AbortController — для отмены долгих операций. Профилируйте event-loop lag (perf_hooks.monitorEventLoopDelay) в production — устойчивый lag > 50ms = проблема.
Типичные ошибки
Ловушки Promises: забытый await → unhandled promise rejection (Node логирует warning, скоро будет crash); Promise.all падает на первом, когда хотели partial success (Promise.allSettled); глубокие then-цепочки там, где async/await читался бы линейно; setTimeout(0) для "yield в loop" (используйте setImmediate); рекурсия, растящая stack вместо возврата promise.
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…