JavaScript async 와 await 그리고 유용한 Promise APIs
위의 영상을 기반으로 작성하였음.
// async & await
// clear style of using promise
// 1. async
async function fetchUser() {
// do network request in 10 secs ...
return 'ellie';
}
const user = fetchUser();
user.then(console.log);
console.log(user);
// 2. await ✨
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(1000);
return '🍎';
}
async function getBanana() {
await delay(1000);
return '🍌';
}
function pickFruits() {
return getApple()
.then(apple => {
return getBanana()
.then(banana => `${apple} + ${banana}`);
});
}
async function pickFruits() {
const applePromise = getApple();
const bananaPromise = getBanana();
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
// 3. useful Promise APIs
function pickAllFruits() {
return Promise.all([getApple(), getBanana()])
.then(fruits => fruits.join(' + '));
}
pickAllFruits().then(console.log);
function pickOnlyOne() {
return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log);
// 프로미스를 사용하면 반드시 resolve와 reject를 호출해야 함
function fetchUser() {
return new Promise((resolve, reject) => {
// return `ellie`; // 프로미스 pending 상태
resolve(`ellie`); // 프로미스 fulfilled 상태
// reject(new Error(`error`)); // 프로미스 rejected 상태
});
}
const user = fetchUser();
// console.log(user);
user.then(user => console.log(user));
// 1. 함수 선언식
async function fetchUser() {
return `ellie`;
}
// 2. 함수 표현식
const fetchUser = async function() {
return `ellie`;
};
// 3. 화살표 함수
const fetchUser = async () => {
return `ellie`;
};
// fetchUser().then(data => console.log(data)); // 함수로 바로 호출
const user = fetchUser(); // 변수에 할당해서 호출
user.then(data => console.log(data));
console.log(user);
function delay(ms) {
return new Promise (resolve => setTimeout(resolve, ms));
}
function getApple() {
return delay(1000)
.then(() => `🍎`);
}
function getBanana() {
return delay(1000)
.then(() => `🍌`);
}
function pickFruits() {
return getApple()
.then(apple => {
return getBanana().then(banana => `${apple} + ${banana}`);
});
}
pickFruits().then(result => console.log(result));
function delay(ms) {
return new Promise (resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(1000);
// throw new Error(`error: apple`); // error 발생
return `🍎`;
}
async function getBanana() {
await delay(1000);
// throw new Error(`error: banana`);
return `🍌`;
}
async function pickFruits() {
let apple = null;
try {
apple = await getApple();
} catch(error) {
console.log(error);
}
let banana = null;
try {
banana = await getBanana();
} catch(error) {
console.log(error);
}
return `${apple} + ${banana}`;
}
pickFruits().then(result => console.log(result));
function delay(ms) {
return new Promise (resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(1000);
return `🍎`;
}
async function getBanana() {
await delay(1000);
return `🍌`;
}
// 방법 1: 무식한 코드
async function pickFruits() {
// 프로미스 객체는 선언 즉시 바로 실행됨
// getApple과 getBanana는 병렬(독립적)로 실행됨
const applePromise = getApple();
const bananaPromise = getBanana();
// 동기화
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
pickFruits().then(result => console.log(result));
// 방법 2: Promise APIs 사용
function pickAllFruits() {
return Promise.all([getApple(), getBanana()]).then(fruits => {
return fruits.join(` + `);
});
// return Promise.all([getApple(), getBanana()]);
}
pickAllFruits().then(console.log);
// 번외: 비동기 처리중 먼저 리턴하는 녀석만 출력
function pickOnlyOne() {
return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log);
상황극 너무 귀여우신데요?? 덕분에 이해가 잘 됐습니다! 타입스크립트 박살내러 가겠습니다!