그렇다면 Promise란 뭘까요?
프로미스는 자바스크립트 비동기 처리에 사용되는 객체입니다. 여기서 자바스크립트의 비동기 처리란 ‘특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 먼저 수행하는 자바스크립트의 특성’을 의미합니다.
프로미스는 주로 서버에서 받아온 데이터를 화면에 표시할 때 사용합니다. 일반적으로 웹 애플리케이션을 구현할 때 서버에서 데이터를 요청하고 받아오기 위해 아래와 같은 API를 사용합니다.
function fetchAuthorName(postId) {
return fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`)
.then((response) => response.json())
.then((post) => post.userId)
.then((userId) => {
return fetch(`https://jsonplaceholder.typicode.com/users/${userId}`)
.then((response) => response.json())
.then((user) => user.name);
});
}
fetchAuthorName(1).then((name) => console.log("name:", name));
근데 여기서 문제점이 있습니다.
그래서 나온 것이 async, await 입니다. 위의 샘플을 함수를 이용해 바꿔보겠습니다.
async function fetchAuthorName(postId) {
const postResponse = await fetch(
`https://jsonplaceholder.typicode.com/posts/${postId}`
);
const post = await postResponse.json();
const userId = post.userId;
const userResponse = await fetch(
`https://jsonplaceholder.typicode.com/users/${userId}`
);
const user = await userResponse.json();
return user.name;
}
fetchAuthorName(1).then((name) => console.log("name:", name));
훨씬 가독성이 좋아졌습니다. 이제 한 번 async와 await을 알아보도록 하겠습니다.
async는 항상 function 앞에 위치하며 function 앞에 Promise를 붙히면 항상 Promise를 반환합니다.
async가 붙은 함수는 반드시 프라미스를 반환하고, 프라미스가 아닌 것은 프라미스로 감싸 반환합니다.
<!DOCTYPE html>
<script>
"use strict";
async function f() {
return 1;
}
f().then(alert); // 1
</script>
자바스크립트는 await 키워드를 만나면 Promise가 처리될 때 까지 기다립니다. 결과는 그 이후 반환됩니다!
일반 함수에는 절대 사용할 수 없으며 async 함수 안에서만 사용 가능합니다.
await 함수는 최상위 레벨 코드에 사용할 수 없으나 익명 async함수로 코드를 감싸면 사용할 수 있습니다.
// await는 async 함수 안에서만 동작합니다.
let value = await promise;
async/await를 사용하면 promise.then/catch가 거의 필요 없습니다. 하지만 가끔 가장 바깥 스코프에서 비동기 처리가 필요할 때같이 promise.then/catch를 써야만 하는 경우가 생기기 때문에 async/await가 promise 기반으로 한다는 사실을 알고 계셔야 합니다. 여러 작업이 있고, 이 작업들이 모두 완료될 때까지 기다리려면 Promise.all을 활용할 수 있다고 합니다!