[패스트캠퍼스 수강 후기] 프론트엔드 인강 100% 환급 챌린지 16회차 미션 - 28강 비동기처리(async, await, Promise.all, Promise.race)

2 minute read

async, await는 promise를 더 편하게 쓰기 위한 것이다.

async / await

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
} //특정 ms 이후에 resolve함수가 실행되서 promise가 끝나게 됨.

async function process() { //async를 붙여서 함수를 만듬.
  console.log("안녕하세요!");
  await sleep(1000); //기다리게 하고 싶을때 함수명 앞에 await을 붙임.
  console.log("반갑습니다!");
  return true;
}

process().then((value) => {
  console.log(value);
});

이런식으로 사용할 수 있다.
promise에서 에러를 잡고 싶을 때에는 아래와 같이 한다.

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function makeError() {
  await sleep(1000);
  const error = new Error();
  throw error; //에러를 발생하고 싶을 때는 throw
}

async function process() {
  try {
    //에러를 잡고 싶을때는 try-catch문을 사용.
    await makeError();
  } catch (e) {
    console.error(e);
  }
}
process(); //Error 반환

promise all

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

const getDog = async () => {
  await sleep(1000);
  return "멍멍이";
};

const getRabbit = async () => {
  await sleep(500);
  return "토끼";
};

const getTurtle = async () => {
  await sleep(3000);
  return "거북이";
};

async function process() {
  const dog = await getDog();
  console.log(dog);
  const rabbit = await getRabbit();
  console.log(rabbit);
  const turtle = await getTurtle();
  console.log(turtle);
}
process(); //멍멍이 - 토끼 - 거북이 순으로 나옴. 하나씩 처리하고있음.

여기서 process를 보면 1초뒤 dog를 실행하고 0.5초 뒤 rabbit을, 또 3초 뒤 turtle을 실행하는 것을 볼 수 있다. 이렇게 순서대로 말고 동시에 셋을 다같이 처리할 수는 없을까? 그럴때 Promise.all을 사용하면 된다.

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

const getDog = async () => {
  await sleep(1000);
  return "멍멍이";
};

const getRabbit = async () => {
  await sleep(500);
  return "토끼";
};

const getTurtle = async () => {
  await sleep(3000);
  return "거북이";
};

async function process() {
  const time = Date.now();
  const [dog, rabbit, turtle] = await Promise.all([getDog(), getRabbit(), getTurtle()]); //한번에 처리
  console.log(dog);
  console.log(rabbit);
  console.log(turtle);
  console.log(Date.now() - time);//걸린시간 계산.
}
process(); //멍멍이-토끼-거북이-3002초 순서대로 나옴.

여기서 promise.all을 promise.race로 바꿔주면 가장 실행이 빨리 끝난 함수만 반환해준다. 아래와 같이 코드를 바꿔보고 결과를 봐보자.

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

const getDog = async () => {
  await sleep(1000);
  return "멍멍이";
};

const getRabbit = async () => {
  await sleep(500);
  return "토끼";
};

const getTurtle = async () => {
  await sleep(3000);
  return "거북이";
};

async function process() {
  const time = Date.now();
  const first = await Promise.race([
    getDog(),
    getRabbit(),
    getTurtle()
  ]);
  console.log(first);
}
process();//가장 빨리 끝난 토끼(0.5초)만 반환.

promise.all은 세 함수중에 하나라도 에러가 발생하면 error를 띄워버린다. 근데 promise.race 같은 경우에는 그중에서 제일 빨리 연산을 끝난애가 에러일 때에만 에러로 간주한다는 것 알아두자.

마치면서

얘네를 언제 쓸 수 있는지 아직 잘 모르겠다. ㅜㅜ 실질적인 예시를 하나 빨리 만들어보고 싶다. 너무 이론만 반복하고 있는 느낌이…. 오늘은 여기까지..
시청 영상 28강 3~4까지 수강인증이미지 수강인증이미지 수강인증이미지

프론트엔드 개발 올인원 패키지 with React Online. 👉 https://bit.ly/31Cf1hp

Comments