async
와 await
은 Promise를 좀 더 깔끔하게 쓸 수 있도록 해줍니다.. 그 뿐입니다.
특별한 기능이 딸려있는 게 아님!
먼저 async를 쓰기 전 Promise 예제 코드입니다.
function fetchUser() {
// 네트워크가 대충 잇다치고 10 초후에 soonmac을 출력
return new Promise((resolve, reject)=>{
resolve('soonmac');
});
}
👻Promise가 뭔가요? : 비동기를 간편하게 처리할 수 있도록 도와주는 오브젝트입니다.
new Promise((resolve,reject) => {...})
- resolve: 정상적으로 잘 작동되어서 데이터를 전달
- reject: 실패ㅠㅠ
async를 사용한 코드입니다. 기능하는 건 똑같습니다.
async function fetchUser() {
return "soonmac";
}
예제 코드를 봅시다!
await을 쓰기 전의 코드입니다.
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function getBanana() {
return delay(3000)
.then(()=> '🍌')
// 3초 후(then) 바나나를 반환!
}
then
을 써서 delay 함수가 다 끝날 때까지 기다린 후 바나나를 반환하는 getBanana()
함수를 만들었습니다.
await을 사용한 코드입니다.
async function getBanana() {
await delay(1000);
//delay 함수가 다 끝날 때 까지 기다림
return "🍌";
}
✨await은 async 함수 안에서만 작동함!
then
와 같음.먼저 await을 쓰지 않은 코드입니다.
async function getApple() {
await delay(2000);
return "🍎";
}
async function getBanana() {
await delay(1000);
return "🍌";
}
function pickFruits() {
return getApple().then((apple) => {
return getBanana().then((banana) => `${apple} + ${banana}`);
});
}
getApple()
로 사과를 받고 getBanana()
로 바나나를 받습니다.사과 + 바나나
를 반환합니다.await을 이용해 pickFruits()
함수를 리팩토링하면..
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple} + ${banana}`;
}
getApple()
이 끝날 때 까지 기다린 후 사과를 받아오고참 쉽죠?
❓ 사과, 바나나를 순서대로 기다리는 건 너무 비효율적이야... 둘이 동시에 진행 시키면 안돼?
async function pickFruits() {
const applePromise = getApple();
const bananaPromise = getBanana();
// 상수에 할당해서 프로미스 두개 바로 만들게해서 프로미스 안의 코드 진행시키고
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
좀 복잡하죠? Promise API를 쓰면 위의 코드를 더 쉽게 쓸 수 있습니다.
function pickAllFruits() {
//Promise.all 배열에 전달된 프로미스 값이 다 모일 때까지 존버함
return Promise.all([getApple(), getBanana()])
.then(fruits => fruits.join(" + "));
}
pickAllFruits().then(console.log)
// 결과값 : 🍎+🍌
🍧Promise.all( [ a, b ] ) : a,b 값이 다 모일 때까지 기다림
function pickOnlyOne() {
//Promise.race : 배열에서 전달된 프로미스 중에서 가장 빨리 리턴된 값만 전달됨
return Promise.race([getApple(), getBanana()])
}
//참고로 바나나의 딜레이는 1초 사과의 딜레이는 2초다.
pickOnlyOne().then(console.log)
//결과값 : 🍌
🍧Promise.race( [ a, b ] ) : 배열에 전달된 프로미스 중에서 가장 빨리 리턴된 값만 전달됨
async와 await - 코어 자바스크립트
자바스크립트 13. 비동기의 꽃 JavaScript async 와 await 그리고 유용한 Promise APIs - 드림코딩 by 엘리