Callback의 지옥에 한 번쯤은 다들 빠져보셨을 겁니다. Callback 지옥에 한번 빠지면 코드 가독성도 너무 떨어지고 코드를 짜는 사람도 머리가 아파지는데 비동기 코드를 작성할 때 더욱 효율적인 방법인 Promise & async/await에 대해 공부하여 이러한 지옥에서 빠져나와봅시다.
Promise
Promise 와 async/await은 결론부터 말하자면 둘 다 개발자가 더 읽기 쉽고, 더 쉽게 유지 관리 가능한 방식으로 비동기 코드를 작성하고 처리할 수 있게 해주는 기능입니다. promise는 비동기 작업의 완료(성공 or실패)와 그 결괏값을 나타내는 객체입니다. 이것이 기존 콜백보다 어째서 더 효율적인 걸까요?
promise가 생성될 때 promise는 pending상태가 되고 결과가 값으로 resolved 되거나 오류와 함께 reject 될 수 있습니다. 그리고 promise는 아래 코드와 같이 then을 이용하여 chain연결이 가능하고 출력값을 이를 통해 넘겨주는 것이 가능합니다. 이를 통해 작업의 결과를 처리하고 또한 catch문을 마지막에 사용하여 한번에 error 처리를 할 수 있습니다.
Promise의 예시입니다.
const testPromise = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success!!');
}, 4000);
});
};
testPromise()
.then((data) => { //데이터를 넘겨 받아 처리합니다.
console.log(data);
})
.catch((error) => {
console.error(error);
});
async/await
async/await은 Promise를 사용하기 위해 존재하는 구문입니다. 비동기식 코드를 동기식으로 작성할 수 있어서 읽고 이해하기가 더 쉽습니다.
방식은 이렇습니다. async는 비동기 함수를 선언할 때 사용되고 wait은 promise가 해결될 때까지 기다리는 데 사용됩니다. wait을 사용하면 promise가 resolve 되거나 reject 될 때까진 코드 실행이 멈춥니다. 아래 코드를 보면서 이해해 봅시다.
const testPromise = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success!!');
}, 4000);
});
};
const getData = async () => {
try {
const data = await testPromise();
console.log(data);
} catch (error) {
console.error(error);
}
};
getData();
위 코드에서 testPromise함수는 Promise를 return 하고 wait을 통해 데이터를 콘솔에 기록하기 전 Promise가 resolve or reject 될 때까지 기다립니다. async로 선언된 getData함수는 안에서 wait을 사용할 수 있게 됩니다.