자바스크립트의 비동기 처리 패턴 중 ES7에 나온 최근 문법
기존의 비동기 처리방식인 콜백함수와 프로미스의 단점을 보완하고 개발자가 읽기 좋은(동기함수처럼 읽고쓰기) 코드를 작성하게 도와준다.
동기함수처럼 아래로 차례대로 읽히는 방식의 코드를 구성하는 것이 async, await 문법의 목적
async function 함수명() {
await 비동기_처리_메서드_명();
}
async
라는 예약어가 붙음await
을 붙힌다.주의할 점: 비동기 처리 메서드가 꼭 프로미스 객체를 반환해야
await
가 의도한 대로 동작됨
일반적으로await
의 대상이 되는 비동기 처리 코드는Axios
등 프로미스를 반환하는 API 호출이다.
async & await 문법이 가장 빛을 발하는 순간은 여러 비동기 처리 코드를 작업할 때!
function fetchUser() {
const url = "https://jsonplaceholder.typeicode.com/users/1";
return fetch(url).then(res => res.json());
}
function fetchTodo() {
const url = "https://jsonplaceholder.typeicode.com/todos/1";
return fetch(url).then(res => res.json());
}
/*
1. fetchUser()를 이용하여 사용자 정보 호출
2. 받아온 사용자 아이디가 1이면 할일 정보 호출
3. 받아온 할 일 정보의 제목을 콘솔에 출력
*/
async function logoTodoTitle() {
const user = await fetchUser();
if (user.id === 1) {
const todo = await fetchTodo();
console.log(todo.title);
}
}
async & await 에서 예외를 처리하는 방법은 try & catch
이다.
프로미스에서 에러처리를 위해 .catch()
를 사용했던 것처럼 async
에서는 catch{}
를 사용하면 된다.
async function logoTodoTitle() {
try {
const user = await fetchUser();
if (user.id === 1) {
const todo = await fetchTodo();
console.logo(todo.title);
}
} catch (err) {
console.log(err);
}
}
예외처리를 하려는 비동기 로직마다 try & catch
를 묶어서 작성하게되면 코드가 더러워 지게된다.
async function towerOfTerror() {
let a;
let b;
let c;
try {
a = await step1();
} catch (err) {
handle(err);
}
try {
b = await step2(a);
} catch (err) {
handle(err);
}
try {
c = await step3(b);
} catch (err) {
handle(err);
}
return a + b + c;
}
await
이 붙은 비동기처리 코드는 Promise
를 반환하므로 catch()
를 활용할 수 있다.
async function towerOfTerror() {
let a;
let b;
let c;
a = await step1().catch(err => handle(err));
b = await step2(a).catch(err => handle(err));
c = await step3(b).catch(err => handle(err));
return a + b + c;
}
try catch to repace
를 구현하는 함수를 만들어서 활용
/*
* 첫 번째 요소는 데이터, 두번째 요소는 오류이다. [data, error]
*/
async function awesome(promise) {
try {
const data = await promise;
return [data, null];
} catch (err) {
console.error(err);
/*
* 오류가 있으면 데이터가 null 이고 오류가 정의된다. [null, error] */
return [null, err];
}
}
async function main() {
/*
* 오류 처리를 한줄로 정리가능
*/
const [data, err] = await awesome(promise);
if (err) {
/*
* if문을 사용하여 코드를 깔끔하게 정리할 수 있다.
*/
}
const [data2, err2] = await awesome(promise);
const [data3, err3] = await awesome(promise);
}