📖 Scenario: You are building a simple Svelte app that fetches a user's profile data from a server. The data takes some time to load, so you want to show a loading message while waiting, display the profile when ready, and show an error message if something goes wrong.
🎯 Goal: Create a Svelte component that uses the {#await} block to handle asynchronous data fetching. The component should show a loading message while waiting, display the user name when the data is loaded, and show an error message if the fetch fails.
📋 What You'll Learn
Create a promise that simulates fetching user data
Create a variable to hold the promise
Use the {#await} block with then and catch sections
Display appropriate messages for loading, success, and error states
💡 Why This Matters
🌍 Real World
Await blocks are useful in real apps to show loading states and errors when fetching data from servers.
💼 Career
Understanding how to handle asynchronous data and show feedback to users is essential for frontend developers working with modern frameworks like Svelte.
Progress0 / 4 steps
1
Create a promise to fetch user data
Create a variable called userPromise that is a new Promise. The promise should resolve after 2 seconds with an object { name: 'Alice' }.
Svelte
Hint
Use new Promise and setTimeout to simulate a delayed fetch.
2
Add a loading message variable
Create a variable called loadingMessage and set it to the string 'Loading user data...'.
Svelte
Hint
Just create a simple string variable for the loading text.
3
Use the {#await} block to handle the promise
In the Svelte component markup, use the {#await userPromise} block. Inside it, show {loadingMessage} while waiting. Use then user to display <p>User name: {user.name}</p>. Use catch error to display <p>Error loading user data</p>.
Svelte
Hint
Use the Svelte {#await} block with then and catch sections to handle the promise states.
4
Add error simulation and final markup
Modify the userPromise to sometimes reject with an error message 'Failed to fetch' after 2 seconds. Keep the rest of the code the same. This simulates a fetch failure. Ensure the {#await} block handles this error and shows the error message.
Svelte
Hint
Use reject inside the promise to simulate an error. The {#await} block will show the error message.
Practice
(1/5)
1. What is the main purpose of the {#await} block in Svelte?
easy
A. To handle asynchronous data by showing loading, success, and error states
B. To create loops for rendering lists
C. To define reactive variables
D. To style components conditionally
Solution
Step 1: Understand the role of {#await} in Svelte
The {#await} block is designed to handle promises and asynchronous data by showing different UI states while waiting, on success, or on error.
Step 2: Compare with other options
Creating loops is done with {#each}, defining reactive variables with let or $:, and styling conditionally with class: or style:, which are not the purpose of {#await}.
Final Answer:
To handle asynchronous data by showing loading, success, and error states -> Option A
Quick Check:
Await blocks = handle async states [OK]
Hint: Await blocks manage async loading and errors [OK]
Common Mistakes:
Confusing await blocks with loops
Thinking await blocks define reactive variables
Assuming await blocks are for styling
2. Which of the following is the correct syntax to start an await block in Svelte for a promise named dataPromise?
easy
A. {#await: dataPromise} ... {/await}
B. {#await (dataPromise)} ... {/await}
C. {#await await dataPromise} ... {/await}
D. {#await dataPromise} ... {/await}
Solution
Step 1: Recall the basic syntax of await blocks
The correct syntax is {#await promise} followed by the block content and closed with {/await}.
Step 2: Analyze each option
{#await dataPromise} ... {/await} matches the correct syntax. {#await (dataPromise)} ... {/await} adds unnecessary parentheses. {#await await dataPromise} ... {/await} repeats 'await' incorrectly. {#await: dataPromise} ... {/await} uses a colon which is invalid.
Hint: Use {#await promise} without extra symbols [OK]
Common Mistakes:
Adding parentheses around the promise
Repeating the 'await' keyword inside the block
Using colons after #await
3. Given the following Svelte code snippet:
{#await fetchData()}
Loading...
:then data
{data.message}
:catch error
Error: {error.message}
{/await}
What will be displayed if fetchData() returns a promise that resolves to { message: 'Hello!' }?
medium
A.
Loading...
B.
Error: ...
C.
Hello!
D. Nothing will be displayed
Solution
Step 1: Understand the promise resolution
The promise returned by fetchData() resolves successfully with an object containing { message: 'Hello!' }.
Step 2: Determine which await block section runs
Since the promise resolves, the :then block runs, displaying {data.message} which is 'Hello!'.
Final Answer:
<p>Hello!</p> -> Option C
Quick Check:
Resolved promise shows then block [OK]
Hint: Resolved promise shows :then content [OK]
Common Mistakes:
Thinking loading shows after resolution
Confusing :catch with :then
Expecting no output on success
4. Identify the error in this Svelte await block:
{#await loadData()}
Loading...
:then result
{result}
:catch
Error occurred
{/await}
medium
A. Incorrect use of :then keyword
B. Missing variable name after :catch
C. No closing {/await} tag
D. Promises cannot be used in await blocks
Solution
Step 1: Review the :catch syntax in await blocks
The :catch block must include a variable name to capture the error, like :catch error.
Step 2: Check the given code
The code uses :catch without a variable name, which is a syntax error.
Final Answer:
Missing variable name after :catch -> Option B
Quick Check:
:catch needs error variable [OK]
Hint: Always name error after :catch [OK]
Common Mistakes:
Omitting error variable in :catch
Forgetting {/await} closing tag
Misusing :then keyword
5. You want to show a loading spinner while waiting for userData promise, display the user's name on success, and show a retry button on error. Which Svelte await block correctly implements this behavior?
hard
A. {#await userData}
:then user
{user.name}
:catch error Retry {/await}
B. {#await userData}
Loading...
:then user
{user.name}
{/await}
C. {#await userData}
:catch error Retry {/await}
D. {#await userData}
:then user
{user.name}
:catch Retry {/await}
Solution
Step 1: Verify loading, success, and error states
{#await userData}
:then user
{user.name}
:catch error Retry {/await} shows a spinner during loading, displays user name on success with :then user, and shows a retry button with error variable error in :catch.
Step 2: Check other options for missing parts
{#await userData}
Loading...
:then user
{user.name}
{/await} lacks error handling. {#await userData}
:catch error Retry {/await} lacks success handling. {#await userData}
:then user
{user.name}
:catch Retry {/await} misses error variable after :catch.
Final Answer:
{#await userData}
:then user
{user.name}
:catch error Retry {/await} -> Option A
Quick Check:
All states with variables = {#await userData}
:then user
{user.name}
:catch error Retry {/await} [OK]
Hint: Include loading, then, catch with variables [OK]
Common Mistakes:
Omitting :catch block or error variable
Missing :then block for success
Not showing loading state properly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.