language/javascript

JavaScript async์™€ await, ์œ ์šฉํ•œ Promise APIs

1. async

  • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด, js ์—”์ง„์€ ๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๊ทธ ๋’ค๋กœ ์›น ํŽ˜์ด์ง€์˜ UI๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ค ์ˆ˜ํ–‰๋  ๋•Œ๊นŒ์ง€ ๋นˆ ํŽ˜์ด์ง€๋งŒ์„ ๋ณด๊ฒŒ ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • async ํ‚ค์›Œ๋“œ: ์ฝ”๋“œ๋ธ”๋Ÿญ์ด ์ž๋™์œผ๋กœ Promise๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
// clear style of using promise :)
async function fetchUser() {
    // do network request in 10 secs...
    return 'ellie';
}

const user = fetchUser();
user.then(console.log);
console.log(user);

 

2. await

  • await์€ async๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • await์€ delay๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์ค€๋‹ค.
function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple() {
    await delay(1000);
    return '๐ŸŽ';
}

async function getBanana() {
    await delay(1000);
    return '๐ŸŒ';
}

async function pickFruits() {
    const apple = await getApple();
    const banana = await getBanana();
    return `${apple} + ${banana}`;
}

pickFruits().then(console.log);

 

3. await ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ with Promise APIs

  • ์œ„์˜ ์ฝ”๋“œ๋Š” getApple() ์‹คํ–‰ ํ›„ getBanana()๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.
  • all(): Promise๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, ๋ชจ๋“  Promise๋“ค์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋‹ค ๋ฐ›์„๋•Œ๊นŒ์ง€ ๋ชจ์•„์ค€๋‹ค.
  • race(): ๋ฐฐ์—ด์— ์ „๋‹ฌ๋œ Promise์ค‘์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๊ฐ’์„ returnํ•˜๋Š” ๊ฒƒ๋งŒ ์ „๋‹ฌํ•œ๋‹ค.
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);

 

 

 

์ฐธ๊ณ 

youtube ๋“œ๋ฆผ์ฝ”๋”ฉ by ์—˜๋ฆฌ

https://www.youtube.com/watch?v=aoQSOZfz3vQ&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=13