이번 시간에는 async 함수가 다른 코드랑 섰여서 실행될때 모습을 살펴보겠습니다. 일단 그전에 알아야 하는 중요한 사실이 있습니다. 그건 바로 await 키워드는 async함수 안에서 사용할수 있다는 사실 입니다. 정말 그런지 한번 살펴 볼게요.
함수 앞에 붙은 async를 지우고 코드를 실행하면 다음과 같이 에러가 납니다. (await함수는 async 안에서만 실행 할수 있다고 써 있네요)
그러니깐 await 키워드는 async함수 안에서 사용할수 있다는 사실 이점 꼭 기억 해주세요.
이제 코드를 본격적으로 수정했습니다. console.log를 넣었고, 1~7까지 숫자를 넣었습니다. 여기써 있는 순서대로 각 console.log 실행 됩니다. 왜 그렇게 실행 되는지 설명해드릴게요.
이 코드를 실행하면 일단 저기서 함수를 선언하고
console.log(1) 가 실행되고
fetchAndPrint() 가 호출되고 함수 안에서 console.log(2)가 실행 됩니다.
그리고 여기서 await을 만나게 됩니다.
await을 만나면 일단 그 뒤에 코드를 실행하고, 코드의 실행 흐름은
현재 fetchAndPrint() 호출한곳으로 가게 됩니다. 그러니깐 fetchAndPrint()함수 밖으로 실행 흐름이 바뀐다는 거죠. 이게 아주 중요한 핵심 계념이니깐 잘 기억해주셔야 합니다.!! 그리고 console.log(3), console.log(4), console.log(5), console.log(6) 남은 코드가 쭉쭉 실행 됩니다.
이렇게 밖에 코드가 다 실행한 후에는 아까 await문 뒤에 있던 Promise 객체가 fulfilled상태가 될때까지 기다립니다. 이때 이미 fulfilled상태가 되었을수도 있고, fulfilled상태가 될때까지 더 기다려야 할 수도 있습니다.
어째든 fulfilled상태가 되면 await은 Promise 객체의 작업성공 결과인 response객체를 추출해서 리턴합니다. 그리고 그 다음 코드가 실행되어서 console.log(7)이 출력 됩니다.
그다음 이번에도 await을 만나게 되는데 이때도 똑같이 일단 await 뒤에 코드가 실행되고
다시 코드 실행 흐름은 fetchAndPrint() 함수 밖으로 나가게 됩니다. 하지만 밖에는 이제 더이상 실행할 코드가 없습니다.
그래서 이제는 그냥 text() 메소드가 리턴하는 Promise 객체가 fulfilled상태가 될때까지 기다립니다.
Promise 객체가 fulfilled상태가 되면 그 작업 성공 결과인 실제 response 내용이 result 변수에 할당되고, 그 내용이 출력되면 끝이 납니다.
👉 정리
이렇게 async함수와 그 주변 코드들이 함께 실행되는 모습을 보면 async함수 안에 비동기 실행된다는 부분이 있다라는 말을 실감할수 있습니다. 왜냐하면 await을 만나는 순간 코드의 흐름은 함수 밖으로 나가서 함수 밖에 코드를 실행하고 돌아오기 때문 입니다.
함수에 await이 존재하면 코드가 보이는 순서대로 실행되는것이 아니라는 점 꼭 기억해야 합니다!! 사실 async / await은 Promise Chaining을 좀더 편하게 나타내기 위한 문법이기 때문에 그렇습니다.
노란 박스있는 코드를 async / await를 빼는 원래는 초록색 박스에 있는 코드와 똑 같습니다. 초록색 박스에 있는 코드를 async / await를 붙여서 노란 박스있는 코드로 나타낸것 뿐입니다.
그리고 async는 이 fetchAndPrint함수가 비동기 실행되는 함수라는 뜻 입니다.
이 말은 결국 함수안에는 당장 실행되는것이 아니라, 함수 밖에 코드들이 다 실행한 다음 그 뒤에 또 실행될 코드들이 있다라는 뜻 입니다.
그리고 그것은 바로 await이 붙은 코드들 이고요. 즉 async/await는 실행 순서를 보장해야 할때 사용하면 좋습니다.