하다보니

비동기의 꽃 JavaScript async와 await, 그리고 유용한 promise APIs 본문

프로그래밍 언어/JavaScript

비동기의 꽃 JavaScript async와 await, 그리고 유용한 promise APIs

claire 2022. 1. 24. 14:26

async와 await는 promise를 좀 더 간결하고 간편하고 동기적으로 실행되는 것처럼 보이게 만들어 주는 것.

promise를 chining을 계속 할 수 있는데 코드가 난잡해질 수 있다.

기존에 존재하는 promise에 좀 더 간편한 api로 async와 await를 사용하면 코드를 동기식으로 작성하는 것처럼 간편한 작성을 도와준다.

새로운 것이 추가된 것이 아닌 기존에 존재하는 기능에 좀 더 간편한 api를 제공한다. 이렇게 기존에 존재하는 것 위에 기존에 존재하는 것을 감싸서 우리가 좀 더 간편하게 쓸 수 있는 api를 제공하는 것을 syntactic sugar이라 한다. 

자바 스크립트에서 class는 완전히 새로운 것이 아니라 프로토타입을 베이스로 한 syntactic sugar이다. 

 

async와 await은 깔끔하게 promise를 사용할 수 있는 방법이다. 

// async & await
// clear style of using promise :)

function fetchUser() {
  return new Promise((resolve, reject) => {
    resolve("ellie");
  });
}
//위와 같은 promise를 아래 async를 사용해서 간편하게 쓸 수 있다. 
// 1. async
async function fetchUser() {
  // do network reqeust in 10 secs....10초가 걸리는 네트워크 요청
  return 'ellie';
}

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

async가 없다면 10초동안 빈 화면에서 기다려야 한다. 

// 2. await ✨
//async 함수 안에서만 쓸 수 있다. 
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple() {
//await을 쓰면 delay함수를 기다려 준다. 
  await delay(2000);
  return '🍎';
}

async function getBanana() {
  await delay(1000);
  return '🍌';
}

//아래의 함수를 위의 코드처럼 바꾼 것이다. 
function getBanana(){
	return delay(3000)
    .then(()=>'🍌');

async function pickFruits() {
	//프로미스를 바로 실행을 한다. 
  const applePromise = getApple();
  const bananaPromise = getBanana();
  //여기서 병렬적으로 실행해준다. 
  const apple = await applePromise;
  const banana = await bananaPromise;
  return `${apple} + ${banana}`;
}

//위처럼 병렬적으로 코드를 수행할 수 있는 경우는 api를 사용해서 간단하게 작성한다. 3번으로 ㄱㄱ

//아래의 코드처럼 chaining이 많아지면 가독성이 떨어지고 콜백지옥...처럼..문제 생김...
function pickFruits(){
    return getApple().then(apple=>{
        return getBanana().then(banana=>`${apple}+${banana}`);
    });
}

pickFruits().then(console.log);
// 3. useful APIs ✨
function pickAllFruits() {
//ALL은 프로미스 배열을 전달하면 모든 프로미스가 병렬적으로 다 받아질 때까지 모아준다. 
  return Promise.all([getApple(), getBanana()]).then(fruits =>
    fruits.join(' + ')
  );
}
pickAllFruits().then(console.log);

function pickOnlyOne() {
//race는 가장 먼저 값을 리턴하는 것만 전달된다. 
  return Promise.race([getApple(), getBanana()]);
}

pickOnlyOne().then(console.log);

'프로그래밍 언어 > JavaScript' 카테고리의 다른 글

[JavaScript] 스프레드 연산자  (0) 2022.03.26
[JavaScript] sort 함수  (0) 2022.03.24
프로미스 개념부터 활용까지  (0) 2022.01.22
비동기 처리의 시작 콜백 이해하기  (0) 2022.01.21
JSON  (0) 2022.01.18