PassFront
  1. PassFront
  2. База знаний
  3. API и асинхронность

Для чего нужен асинхронный компонент?

API и асинхронность

Асинхронный компонент (async-функция как компонент) — это серверный компонент, который может ждать данные прямо в своём теле. Нужен, чтобы данные и разметка описывались вместе, без эффектов и состояний загрузки в коде.

Как выглядит

// серверный компонент (Next.js App Router)
const ProductPage = async ({ params }) => {
  const product = await db.products.find(params.id);  // ждём прямо в теле
  const reviews = await api.getReviews(params.id);

  return (
    <>
      <ProductInfo product={product} />
      <Reviews items={reviews} />
    </>
  );
};

Что это даёт

  • Исчезает клиентский бойлерплейт: не нужно useEffect + useState + isLoading/error — компонент просто «имеет» данные.
  • Данные ближе к месту использования: каждый компонент запрашивает своё, а не страница собирает всё сверху.
  • Быстрее и безопаснее: запросы выполняются на сервере (рядом с БД), секреты не утекают, код запроса не попадает в бандл.
  • Состояния ожидания выражаются декларативно: обёртка <Suspense fallback={...}> показывает скелетон, пока компонент ждёт; стриминг отдаёт остальную страницу сразу.

Ограничения

Async-компоненты работают только как серверные (RSC): в клиентских компонентах async-функция не поддерживается — там данные получают через хуки (React Query) или через хук use(promise) (React 19), который «разворачивает» промис с поддержкой Suspense:

'use client';
const Comments = ({ commentsPromise }) => {
  const comments = use(commentsPromise); // клиентский способ «подождать»
  ...
};

Коротко для собеседования

Асинхронный компонент — серверный компонент-async-функция: await данных прямо в теле, без useEffect/isLoading; ожидание оформляется Suspense-границами со стримингом. Работает только на сервере; на клиенте аналог — hook use(promise) из React 19 или React Query.

Другие вопросы раздела