JS & TS

[JS] async, await 함수

퉁그리 2022. 7. 8. 17:54

async 함수는 비동기 작업을 한다.

 

new Promise를 리턴하던 함수를 조금씩 수정하면 async함수로 변환이 가능하다.

 

- 함수에 async 키워드를 붙인다.

- new Promise 리턴을 없애고 executor 내용만 남긴다.

- resolve(value); 부분을 return value;로 변경한다.

- rejuect(new Error()); 부분을 throw new Error(...);로 수정한다.

function startAsync(age) {
  return new Promise((resolve, reject) => {
    if (age > 20)
      resolve('${age}');    
    else
      reject(new Error('error'));
  });
}

async function startAsync(age) {
  if (age > 20)
    return '${age}';
  else
    throw new Error(error);
}

이런식으로 바꿀 수 있다.

기존 함수를 async 함수로 바꾸면서 알 수 있는 내용은 async함수는 promise객체 자체를 리턴한다라는 것이다. 때문에 일반함수와 사용법을 달리해야만 한다. 이 불편함을 줄이기 위해 나온 문법이 await다.

 

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

async function startAsync(age) {
  if (age > 20)
    return '${age}';
  else
    throw new Error('${age}');
}

async function startAsyncJobs() {
  await setTimeoutPromise(1000);
  
  const pms1 = startAsync(25);
  try {
    const value = await pms1;
    console.log(value);
  } catch (e) {
    console.error(e);
  }
  const pms2 = startAsync(15);
  try {
    const value = await pms2;
    console.log(value);
  } catch (e) {
    console.error(e);
  }
}

startAsyncJobs();

await의 특징은 이렇다.

 

1. 문법적으로 await p[[Promise 객체]] 이렇게 사용한다.

2. await은 Promise가 완료될 때까지 기다린다.(동기식)

3. await은 resolve를 리턴한다. reject가 발생하는 건에 대해선 예외를 발생시킨다. 때문에 기존의 async함수를 쓰는것과 다르게 await을 쓸 때는 try catch를 써야한다.