💡 promise를 async와 await을 이용해 더 간단하게 작성하는 방법을 공부해보자!
async
와 await
은 promise
를 조금더 간결, 간편, 동기적으로 실행되는 것처럼 보이게 만들어 준다.promise chaining
을 계속하다보면 코드가 난잡해질 수 있다.async
와 await
를 사용하면 우리가 그냥 동기식으로 코드를 순서대로 작성하는 것처럼 간편하게 작성할 수 있게 도와준다.async
와 await
는 새로 추가된 것이 아니라 기존에 존재하는 promise
위에 조금더 간편한 api를 제공한 것syntactic sugar
: 기존에 존재하는 것 위에, 기존에 존재하는 것을 감싸서 우리가 조금 더 간편하게 쓸 수있는 api를 재공하는 것 ex) classpromise
가 나쁘고, async & await
으로 전부 바꿔써야된다는 것은 아님(둘의 차이점을 이해하고, 상황에 맞게 잘 써야함)function fetchUser () {
// do network request in 10 secs...
return 'ellie';
}
const user = fetchUser();
console.log(user);
fetchUser()
함수가 실행이 되면 함수의 코드 블럭으로 가서 10초 후에 'ellie'라는 값을 리턴해준다.// promise를 써서 비동기적으로 처리
function fetchUser () {
return new Promise((resolve, reject) => {
// do network request in 10 secs...
return 'ellie';
})
}
const user = fetchUser();
console.log(user);
resolve
와 reject
를 호출하지 않고, 저런 식으로 리턴을 하게 되면, promise
가 pending
상태가 되어있는 것을 확인해 볼 수 있다.resolve
와 reject
로 완료를 해줘야만 한다.function fetchUser () {
return new Promise((resolve, reject) => {
// do network request in 10 secs...
resolve('ellie');
})
}
const user = fetchUser();
user.then(console.log);
console.log(user);
fulfilled
로 바뀌고, 결과값도 ellie
로 출력이 되는 것을 확인해 볼 수 있다.then
이라는 콜백 함수를 이용해서 유저가 들어오면 콘솔로그에 나오겠금 작성해볼 수 있다.promise
말고 async
로 간단하게 작성해볼 수 있다.async
키워드만 붙이면된다. 그러면 자동적으로 코드 블럭들이 promise
로 변환이 되어진다.async function fetchUser () {
// do network request in 10 secs...
return 'ellie';
}
const user = fetchUser();
user.then(console.log);
console.log(user);
promise
를 사용했을 때와 똑같이 출력된다.await
이라는 키워드는 async
가 붙은 함수 안에서만 쓸 수 있다.function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(3000); // 3초 후 resolve를 호출
return '🍎';
}
async function getBanana() {
await delay(1000); // 딜레이가 끝날 때까지 기다렸다가!
return '🍌'; // 바나나를 출력해줘
}
delay()
는 promise
를 return하는데 정해진 ms가 지나면 resolve
를 호출하는 그런 프로미스를 리턴하게 된다.getApple()
은 3초 후에 resolve를 호출할 것인데, await
키워드 때문에, delay(3000)
이 끝날 때 까지 기다려 준다.getBanana
도 프로미스를 만드는 함수이다. 이 아이도 3초 후에 바나나를 리턴하는 함수이다.function pickFruits() {
return getApple().then((apple) => {
return getBanana().then((banana) => `${apple} + ${banana}`);
});
}
pickFruits().then(console.log);
async function pickFruits() {
const apple = await getApple(); // 사과와
const banana = await getBanana(); // 바나나를 다 받아와서
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
await
, async
라는 키워드를 이용해서 우리가 동기적으로 코드를 작성하듯이 즉, 우리가 원래 자연스럽게 코드를 작성하는 것처럼 쓰고, 리턴값도 자연스럽게 하니까 너무 간편함try-catch
문async function getApple() {
await delay(2000);
throw 'error'
return '🍎';
}
async function getBanana() {
await delay(1000);
return '🍌';
}
async function pickFruits() {
try {
const apple = await getApple();
const banana = await getBanana();
} catch {
}
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
async function getApple() {
await delay(1000);
throw 'error'
return '🍎';
}
async function getBanana() {
await delay(1000);
return '🍌';
}
async function pickFruits() {
const apple = await getApple(); // 1s 소요
const banana = await getBanana(); // 1s 소요
return `${apple} + ${banana}`; // 총 2s 소요
}
pickFruits().then(console.log);
async function pickFruits() {
const applePromise = getApple();
const bananaPromise = getBanana();
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
: 프로미스 배열을 전달하게 되면 모든 프로미스들이 병렬적으로 다 받을 때까지 모아주는 API
function pickAllFruits() {
return Promise.all([getApple(), getBanana()]).then((fruits) => fruits.join(' + '));
}
pickAllFruits().then(console.log); // 🍎 + 🍌
async function getApple() {
await delay(2000); // 사과는 따는데 2초
throw 'error'
return '🍎';
}
async function getBanana() {
await delay(1000); // 바나나는 따는데 1초
return '🍌';
}
function pickOnlyOne() {
return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log);
race
API를 쓰면 가장 먼저 값을 리턴하는 것만 전달이되어진다.async getUserWithRole(user, password) {
const id = await this.loginUser(user, password);
const role = await this.getRoles(id);
return role;
}
userStorage
.getUserWithRole(id, password) //
.catch(console.log)
.then(console.log);
➕ 추가로 공부할 것
1.try-catch
문 공부하기