코드만 보면 동기적으로 실행되는 것 처럼 보이나(가독성 증대 효과!) 손쉽게 비동기 처리 가능 (promise/then) 의 단점(콜백지옥) 개선 가능!!!
//promise
function fetchUser() {
return new Promise((resolve, reject) => {
resolve("gyong");
});
}
//async
async function fetchUser() {
//어어어어어어어어어어엄청 오래걸리는 작업
return "gyong";
}
const user = fetchUser();
user.then(console.log);
await는 async내에서만 사용 가능하다!
말로 풀어보자면 await를 붙여준 작업이 끝날때까지 기다려준다는 의미!
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function getApple() {
await delay(2000);
return "apple";
}
async function getBanana() {
await delay(1000);
return "banana";
}
function getFruits() {
return getApple().then((apple) => {
return getBanana().then((banana) =>
console.log(`${apple}이랑 ${banana}`)
);
});
}
이를 async를 활용해 깔끔하게 바꿔보쟈!!
async function getFruits(){
const applePromise = await getApple(); //2초
const bananaPromise = await getBanana();// 1초
return `${applePromise}랑 ${bananaPromise}`;
}
async function getAllFruits() {
return Promise.all([getApple(), getBanana()]).then((fruits) =>
fruits.join(" & ")
);
}
getAllFruits().then(console.log);
그럼 둘 중 먼저 불러온 데이터를 사용하고싶다면 어떻게 처리할 수 있을까!
async function getFirstFruit() {
return Promise.race([getApple(), getBanana()]).then((fruit) =>
console.log(fruit)
);