처음부터 비동기 처리를 위해 async-await를 써온 줄 알았는데 async-await도 역사가 있었다.
역시 세상에 똑똑한 개발자는 넘나 많은 것...
async-await를 쓰기까지의 과정을 살펴보자!
Callback 함수란 함수의 인자로 들어가는 함수를 말한다.
function aaa(qqq) {
// 함수 로직
}
aaa(() => {})
여기서 aaa 안에 들어가는 화살표 함수를 Callback 함수라고 한다.
export default function CallbackPromiseAsyncAwaitPage() {
const onClickCallback = () => {
const aa = new XMLHttpRequest();
aa.open("get", `http://numbersapi.com/random?min=1&max=200`);
aa.send();
// addEventListner야 데이터가 load 됐을 때 callback함수 실행시켜줘
aa.addEventListener("load", (res: any) => {
// console.log(res);
const num = res.target.response.split(" ")[0]; // 랜덤 숫자
const bb = new XMLHttpRequest();
bb.open("get", `http://koreanjson.com/posts/${num}`);
bb.send();
// addEventListner야 데이터가 load 됐을 때 callback함수 실행시켜줘
bb.addEventListener("load", (res: any) => {
// console.log(res);
const userId = JSON.parse(res.target.response).UserId;
const cc = new XMLHttpRequest();
cc.open("get", `http://koreanjson.com/posts?userId=${userId}`);
cc.send();
// addEventListner야 데이터가 load 됐을 때 callback함수 실행시켜줘
cc.addEventListener("load", (res: any) => {
console.log(res);
});
});
});
};
return (
<button onClick={onClickCallback}>Callback 요청하기</button>
)
}
Callback 함수로 비동기 처리를 해 줄 경우 위 코드에서도 대충 볼 수 있듯이 함수를 직관적으로 볼 수 없다.
총 3회의 API 요청만으로도 이렇게 어마어마한 양의 가독성 떨어지는 코드를 보게 되는데, 이러한 현상을 'Callback Hell(콜백 지옥)' 이라고 한다.
이러한 Callback hell을 극복하기 위해 Promise가 생겼다.
Promise란 자바스크립트의 비동기 처리, 그 중에서도 특히 외부에서 많은 양의 데이터를 불러오는 작업에 사용되는 객체이다.
Promise 객체를 활용해서 만든 라이브러리가 axios이므로, Promise를 axios를 통해 살펴보자!
import axios from "axios";
export default function CallbackPromiseAsyncAwaitPage() {
const onClickPromise = () => {
console.log("1번 실행");
// promise chaining (call back hell 극복)
axios
.get("http://koreanjson.com/posts/1")
.then((res) => {
console.log("2번 실행");
return axios.get("http://koreanjson.com/posts/2");
})
.then((res) => {
console.log("3번 실행");
axios.get("http://koreanjson.com/posts/3");
})
.then((res) => {
console.log("4번 실행");
console.log(res);
});
console.log("5번 실행");
};
return (
<button onClick={onClickPromise}>Promise 요청하기</button>
)
}
이 전 글에서 살펴본 것처럼 Promise는 background Micro queue에 들어갔다가 stack이 비워지면 실행된다.
따라서 비동기처리를 위해 Promise를 쓸 경우 코드를 작성한 순서와 다르게 함수가 실행되게 된다는 문제가 있다.
코드를 작성한 순서에 따라 비동기 처리를 하도록 하기 위해 async await가 생기게 되었다.
async-await는 1주차에서 학습한 적이 있다!
추가적으로 알아야할 점은 async-await는 Promise에만 붙일 수 있다는 것이다.
따라서 axios가 Promise 객체를 이용해 만들어진 라이브러리이기 때문에 async-await를 사용할 수 있는 것이다.
async-await를 사용할 경우 코드가 작성된 순서에 따라 차례대로 비동기 처리가 실행된다!
< 이미지 출처 : https://bravenamme.github.io/2019/10/29/javascript-promise/>