Advanced Async Server Component with Parallel and Sequential Data Fetching
Advanced async Server Component patterns with parallel, sequential, and streaming data fetching
// app/dashboard/page.tsx - Server Component
import { Suspense } from 'react';
import { db } from '@/lib/db';
// Parallel data fetching
async function DashboardStats() {
const [users, revenue, orders] = await Promise.all([
db.user.count(),
db.order.aggregate({ _sum: { total: true } }),
db.order.count(),
]);
return (
<div className="grid grid-cols-3 gap-4">
<StatCard label="Users" value={users} />
<StatCard label="Revenue" value={revenue._sum.total} />
<StatCard label="Orders" value={orders} />
</div>
);
}
// Sequential data fetching with dependency
async function UserDashboard({ userId }: { userId: string }) {
// First fetch - user data
const user = await db.user.findUnique({ where: { id: userId } });
// Second fetch - depends on user data
const userOrders = await db.order.findMany({
where: { userId: user.id },
orderBy: { createdAt: 'desc' },
take: 10,
});
return (
<div>
<h1>{user.name}'s Dashboard</h1>
<Suspense fallback={<OrdersSkeleton />}>
<OrdersList orders={userOrders} />
</Suspense>
</div>
);
}
// Streaming promise to Client Component
async function DashboardPage() {
// Don't await - pass promise to Client Component
const analyticsPromise = fetch('https://api.example.com/analytics', {
next: { revalidate: 60 },
});
return (
<div>
<Suspense fallback={<StatsSkeleton />}>
<DashboardStats />
</Suspense>
<Suspense fallback={<AnalyticsSkeleton />}>
<AnalyticsClient analyticsPromise={analyticsPromise} />
</Suspense>
</div>
);
}
export default DashboardPage;
// components/AnalyticsClient.tsx - Client Component
'use client';
import { use } from 'react';
export default function AnalyticsClient({ analyticsPromise }: { analyticsPromise: Promise<any> }) {
const analytics = use(analyticsPromise);
return <AnalyticsChart data={analytics} />;
}