데이터를 너무 빨리 가져오면 왼쪽 상황이 재현되지 않는 것처럼 보일 수 있어요. {#await} 블록에 “가져오는 중 잠시만 기다리세요” 메시지가 보이지 않고 바로 리스트가 나옵니다. 하지만 실제 서비스를 개발할 때는 여러 가지 원인으로 지연이 생기는 경우가 있어서 그럴 때는 잘 보이죠. 그래서 fetch와 함께 쓰는 {#await}는 아주 유용합니다.
전체 코드는 다음과 같습니다.
REPL의 App.svelte 전체 코드
<script>
// async 함수 정의
async function getPosts(){
// 원격지 데이터를 fetch로 가져오기
const res = await fetch("https://jsonplaceholder.typicode.com/posts");
const json = await res.json(); // fetch 결과를 JSON 객체로 변환
return json; // JSON 객체 반환
}
let promisePosts = getPosts(); // 최초 호출
</script>
<main>
<!-- 버튼 클릭 시 getPosts 함수를 호출하여 원격지 데이터 가져오기 -->
<button on:click={() => promisePosts = getPosts()}> 포스트 리스트 가져오기 </button>
<table border="1">
<thead>
<th>id</th>
<th>사용자</th>
<th>타이틀</th>
<th>내용</th>
</thead>
<tbody>
{#await promisePosts} <!-- 동작 중일 때 처리 -->
<tr>
<td colspan=4>
가져오는 중 잠시만 기다리세요
</td>
</tr>
{:then posts} <!-- 정상 종료 후 처리 -->
{#each posts as post} <!-- fetch 결과의 데이터 개수만큼 반복 실행 -->
<tr> <!-- tr, td 엘리먼트로 출력 -->
<td>{post.id}</td>
<td>{post.userId}</td>
<td>{post.title}</td>
<td>{post.body}</td>
</tr>
{/each}
{/await}
</tbody>
</table>
</main>