Async server components let you fetch data or do tasks before showing the page. This makes your app faster and smoother.
Async server components in NextJS
Introduction
Syntax
NextJS
export default async function ComponentName() { const data = await fetchData(); return ( <div>{data}</div> ); }
The component function is marked with
async so you can use await inside.You can fetch data or do other async tasks before returning the JSX to render.
Examples
<h1> tag.NextJS
export default async function Greeting() { const res = await fetch('https://api.example.com/hello'); const message = await res.text(); return <h1>{message}</h1>; }
NextJS
export default async function Time() { const now = new Date().toLocaleTimeString(); return <p>Current time: {now}</p>; }
Sample Program
This component fetches a random joke from an API before rendering. It shows the setup and punchline inside a section with an accessible label.
NextJS
async function getRandomJoke() { const res = await fetch('https://official-joke-api.appspot.com/random_joke'); if (!res.ok) throw new Error('Failed to fetch joke'); return res.json(); } export default async function Joke() { const joke = await getRandomJoke(); return ( <section aria-label="Random joke"> <h2>Here's a joke for you:</h2> <p><strong>{joke.setup}</strong></p> <p>{joke.punchline}</p> </section> ); }
Important Notes
Async server components run only on the server, so you can safely use secrets or server-only code.
They help reduce loading spinners by fetching data before sending HTML to the browser.
Remember to handle errors in async calls to avoid breaking the page.
Summary
Async server components let you fetch data before showing the page.
Use async and await inside the component function.
This improves speed and user experience by sending ready HTML to the browser.
Practice
1. What is the main benefit of using
async server components in Next.js?easy
Solution
Step 1: Understand async server components purpose
Async server components fetch data on the server before rendering the page.Step 2: Identify the benefit of pre-fetching data
This means the browser receives fully rendered HTML, improving speed and user experience.Final Answer:
They fetch data before rendering, sending ready HTML to the browser. -> Option DQuick Check:
Async server components = fetch data first [OK]
Hint: Async server components fetch data before rendering [OK]
Common Mistakes:
- Thinking async components run on the client
- Confusing caching with async data fetching
- Assuming real-time updates happen automatically
2. Which of the following is the correct way to define an async server component in Next.js?
easy
Solution
Step 1: Identify async function syntax for components
Next.js requires the component function to be markedasyncto useawaitinside.Step 2: Check each option for correct async usage
async function MyComponent() { const data = await fetchData(); return{data}; } correctly defines an async function and uses await inside. function MyComponent() { const data = await fetchData(); return{data}; } misses async keyword. const MyComponent = () => { const data = await fetchData(); return{data}; } uses arrow function but misses async. const MyComponent = async () => { fetchData().then(data =>{data}); } uses then() but does not return JSX properly.Final Answer:
async function MyComponent() { const data = await fetchData(); return <div>{data}</div>; } -> Option AQuick Check:
Async keyword + await inside = async function MyComponent() { const data = await fetchData(); return{data}; } [OK]
Hint: Async components must be declared with async keyword [OK]
Common Mistakes:
- Forgetting to add async keyword
- Using await without async function
- Returning JSX inside then() without return statement
3. Given this async server component code, what will be rendered?
async function Greeting() {
const name = await Promise.resolve('Alice');
return <h1>Hello, {name}!</h1>;
}medium
Solution
Step 1: Understand async function behavior in server components
The function awaits the resolved promise 'Alice' and stores it in name.Step 2: Render JSX with awaited value
The component returns an h1 element with the text 'Hello, Alice!'. This HTML is sent to the browser.Final Answer:
<h1>Hello, Alice!</h1> -> Option AQuick Check:
Await resolves promise, renders value [OK]
Hint: Await resolves promise before rendering JSX [OK]
Common Mistakes:
- Thinking JSX shows variable name literally
- Expecting promise object to render
- Assuming await is disallowed in server components
4. What is wrong with this async server component code?
async function UserProfile() {
const user = fetch('/api/user');
return <div>{user.name}</div>;
}medium
Solution
Step 1: Check fetch usage in async function
fetch returns a promise, so it must be awaited to get the data.Step 2: Identify the error in accessing user.name
Without await, user is a promise object, so user.name is undefined causing error.Final Answer:
Missing await before fetch call, so user is a promise, not data. -> Option BQuick Check:
Always await fetch to get data [OK]
Hint: Always await fetch to get resolved data [OK]
Common Mistakes:
- Forgetting await before fetch
- Thinking fetch is disallowed in server components
- Misunderstanding JSX expressions
5. You want to fetch user data and posts in an async server component and render them together. Which code correctly fetches both before rendering?
async function Dashboard() {
const user = await fetch('/api/user').then(res => res.json());
const posts = fetch('/api/posts').then(res => res.json());
return (
<div>
<h1>{user.name}</h1>
<ul>{posts.map(post => <li key={post.id}>{post.title}</li>)}hard
Solution
Step 1: Identify missing await for posts fetch
The posts fetch is missing await, so posts is a promise, not data.Step 2: Fix by adding await to posts fetch
Adding await ensures posts data is ready before rendering the list.Final Answer:
Add await before fetch('/api/posts') to wait for posts data. -> Option CQuick Check:
Await all fetches before rendering [OK]
Hint: Await all fetches before using their data [OK]
Common Mistakes:
- Forgetting await on second fetch
- Removing await on first fetch causing errors
- Returning JSX before data is ready
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
