async/await

김명주·2023년 4월 25일
0

async/await은 기존의 Promise 문법의 문제점을 보완하면서도 더 간결하게 작성할 수 있게 도와주며 사용법도 훨씬 간단하다.

const getMovies = (movieName) => {
    return new Promise(resolve => {
        fetch(`https://www.omdbapi.com/?apikey=7035c60c&s=${movieName}`)
    .then(res => res.json())
    .then(res => {
        console.log(res)
        resolve()
    })
    })
}
// 기존 Promise를 이용한 방법
getMovies('frozen').then(() => {
    console.log('겨울왕국')
    return getMovies('avengers')
}).then(() => {
    console.log('어벤져스')
    return getMovies('avatar')
}).then(() => {
    console.log('아바타')
})

// async/await을 사용한 방법
const wrap = async () => {
    await getMovies('frozen')
    console.log('겨울왕국')
    await getMovies('avengers')
    console.log('어벤저스')
    await getMovies('avatar')
    console.log('아바타')
}
wrap()

위에서 보다시피 async/await 문법을 사용할 때에는, 함수를 선언 할 때 함수의 앞부분에 async 키워드를 붙여서 사용하면 된다. 그리고 Promise 의 앞부분에 await 을 넣어주면 해당 프로미스가 끝날때까지 기다렸다가 다음 작업을 수행 할 수 있다.

함수에서 async 를 사용하면, 해당 함수는 결과값으로 Promise 를 반환하게 된다.

async 키워드

async 키워드는 어렵게 생각할 필요없이 await를 사용하기 위한 선언문 정도로 이해하면 된다. 즉, function 앞에 async을 붙여줌으로써, 함수내에서 await 키워드를 사용할 수 있게 된다. 이는 반대로 말하면 await 키워드를 사용하기 위해선 반드시 async function 정의가 되어 있어야 한다는 말과 같다.

// 함수 선언식
async function func1() {
    const res = await fetch(url); // 요청을 기다림
    const data = await res.json(); // 응답을 JSON으로 파싱
}
func1();

// 함수 표현식
const func2 = async () => {
    const res = await fetch(url); // 요청을 기다림
    const data = await res.json(); // 응답을 JSON으로 파싱
}
func2();

await 키워드

await 키워드는 promise.then() 보다 좀 더 세련되게 비동기 처리의 결과값을 얻을 수 있도록 해주는 문법이라고 보면 된다. 예를들어 서버에 리소스를 요청하는 fetch() 비동기 함수를 다음과 같이 then 핸들러 방식으로 결과를 얻어 사용해왔을 것이다.

// then 핸들러 방식
fetch(url)
    .then(res => res.json()) // 응답을 JSON으로 파싱
    .then(data => {
      // data 처리
      console.log(data);
    })

await 키워드를 사용하면 then 핸들러를 복잡하게 처리할 필요 없이, 심플하게 비동기 함수 왼쪽에 await 만 명시해주고 결과값을 변수에 받도록 코드를 정의하면 끝이다. then과 콜백 함수를 남발하여 코드가 들여쓰기로 깊어지는 것을 방지하고, 한 줄 레벨에서 코드를 나열하여 가독성을 높일 수 있다.

// await 방식
async function func() {
    const res = await fetch(url); // 요청을 기다림
    const data = await res.json(); // 응답을 JSON으로 파싱
    // data 처리
    console.log(data);
}
func();
profile
개발자를 향해 달리는 사람

0개의 댓글