개발 알다가도 모르겠네요

async와 await를 간단하게 알아보자 본문

웹/Javascript

async와 await를 간단하게 알아보자

이재빵 2021. 7. 30. 14:25
728x90
async function fetchAndPrint() {
  console.log(2);
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  console.log(7);
  const result = await response.text();
  console.log(result);
}

console.log(1);
fetchAndPrint();
console.log(3);
console.log(4);
console.log(5);
console.log(6);

사실 fetchAndPrint 함수를 언뜻 보면, 비동기 실행 함수처럼 생기지 않았습니다.

오히려 코드가 등장하는 순서대로 실행될 것처럼 생겼는데 이건 의도된 것입니다.

왜냐하면 async/await 구문 자체가 기존의 Promise 객체를 사용하는 코드(Promise Chaining)를

(1) 개발자가 더 편하게 작성할 수 있도록 하고

(2) 코드의 가독성을 높이기 위해서

도입된 일종의 Syntactic sugar(기존 문법을 더 편하게 사용할 수 있도록 하는 문법적 장치)에 해당하기 때문입니다.

사실 우리에게는 이때까지 배웠던 것처럼

  • 전통적인 형식의 비동기 실행 함수에 콜백을 바로 전달하거나,
  • Promise 객체 뒤에 .then 메소드를 붙이는 것보다는

그냥 코드를 차례대로 써나가는 것이 더 익숙한 방식입니다.

그리고 바로 async/await 구문이 Promise 객체를 우리에게 이미 익숙한 동기 실행 코드 방식으로 다룰 수 있게 해주는 문법인 겁니다.

하지만 동기 실행 코드처럼 보인다고 해서 정말로 동기 실행되는 것은 아닙니다. 

 

코드에서 async/await이 보인다면 사실 비동기 실행되는 코드가 있다는 걸 반드시 기억해야 합니다.

1
2
3
4
5
6
7
[리스폰스의 내용]

 

 

사실 코드의 원래 모습은 아래와 같다고 있습니다.

function fetchAndPrint() {
  console.log(2);
  fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => {
      console.log(7);
      return response.text();
    })
    .then((result) => { console.log(result); });
}

console.log(1);
fetchAndPrint();
console.log(3);
console.log(4);
console.log(5);
console.log(6);

 

정리하면

async 함수 안의 코드가 실행되다가 await을 만나면, 일단 await 뒤의 코드가 실행되고,

코드의 실행 흐름이 async 함수 바깥으로 나가서 나머지 코드를 다 실행합니다.

물론 함수 바깥에 더 이상 실행할 코드가 없을 수도 있습니다. 

어느 경우든 이후로는, await 뒤에 있던 Promise 객체가 fulfilled 상태가 되기를 기다립니다.

그리고 기다리던 Promise 객체가 fulfilled 상태가 되면 await Promise 객체의 작업 성공 결과를 리턴하는 겁니다.