Web Development

async / await

쟤리 2024. 9. 30. 08:05
728x90
반응형

async/await는 비동기 작업을 쉽게 처리할 수 있도록 ES8에서 도입된 자바스크립트 기능임.

Promise 기반의 비동기 코드를 동기식 코드처럼 작성할 수 있게 해주는 문법으로, 비동기 작업의 가독성을 크게 향상시킴.

Q. (비)동기가 뭔데 ?

A. https://jerrycodezzz.tistory.com/54

 

동기(Synchronous) 비동기(Asynchronous)

1. 동기(Synchronous)동기적 처리는 작업이 순차적으로 실행되는 방식임. 하나의 작업이 끝날 때까지 다음 작업이 대기하며, 작업이 완료된 후에야 다음 작업이 실행됨. 즉, 코드가 위에서 아래로 순

jerrycodezzz.tistory.com

 

async 함수

  • async 키워드를 함수 앞에 붙이면, 해당 함수는 자동으로 Promise를 반환함. 즉, 함수 내부에서 비동기 작업을 처리하더라도 async 함수는 항상 Promise 객체를 반환하게 됨.
async function fetchData() {
  return "data loaded";
}

fetchData().then(result => console.log(result)); // "data loaded"

fetchData 함수는 async로 선언되어 있기 때문에 자동으로 Promise를 반환하며, .then()으로 그 결과를 받을 수 있음.

https://jerrycodezzz.tistory.com/62

 

await 키워드

  • **await**는 async 함수 내에서만 사용 가능한 키워드로, Promise가 해결될 때까지 기다린 후, 그 결과를 반환함.
  • 비동기 작업을 마치 동기적으로 처리하는 것처럼 코드를 작성할 수 있게 해줌.
async function fetchData() {
  const data = await new Promise((resolve) =>
    setTimeout(() => resolve("data loaded"), 2000)
  );
  console.log(data); // "data loaded" (2초 후 출력)
}

fetchData();
  • await는 Promise가 완료될 때까지 실행을 일시 중지하고, 완료된 후에 data에 결과를 할당함.
  • 이처럼 await를 사용하면 비동기 작업을 처리할 때 복잡한 then 체인 없이 동기적인 코드처럼 작성할 수 있음.

 

async/await의 장점

  • 가독성 향상: 비동기 작업을 동기적인 방식으로 작성할 수 있어 코드의 가독성이 좋아짐.
  • 에러 핸들링이 간편: try-catch 블록을 통해 에러를 쉽게 처리할 수 있음. Promise의 .catch()를 사용하는 것보다 더 직관적임.
async function fetchData() {
  try {
    const data = await new Promise((resolve, reject) =>
      setTimeout(() => reject("Error occurred"), 2000)
    );
    console.log(data);
  } catch (error) {
    console.error(error); // "Error occurred"
  }
}

fetchData();
  • try-catch 블록을 사용하여 비동기 코드에서 발생하는 에러를 처리할 수 있음.

 

async/await와 Promise 비교

  • Promise는 비동기 작업을 처리하기 위해 .then()과 .catch() 체인으로 연결되며, 다중 비동기 작업의 경우 콜백 지옥과 유사한 구조로 복잡해질 수 있음.
  • async/await는 이러한 비동기 흐름을 동기식 코드처럼 작성할 수 있게 해주므로, 코드를 이해하고 유지보수하기 쉽게 만들어줌.

promise :

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve("data loaded"), 2000);
  });
}

fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

 

async / await :

async function fetchData() {
  try {
    const data = await new Promise((resolve) =>
      setTimeout(() => resolve("data loaded"), 2000)
    );
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

fetchData();

 

 

병렬 처리

await는 Promise가 완료될 때까지 기다리는 특성이 있으므로, 여러 비동기 작업을 순차적으로 실행하게 되면 시간이 오래 걸림. 이를 해결하기 위해 **Promise.all()**과 함께 사용하여 비동기 작업을 병렬로 처리할 수 있음.

async function fetchData() {
  const promise1 = new Promise((resolve) => setTimeout(() => resolve("data 1"), 2000));
  const promise2 = new Promise((resolve) => setTimeout(() => resolve("data 2"), 2000));

  const [result1, result2] = await Promise.all([promise1, promise2]);
  console.log(result1, result2); // "data 1" "data 2" (둘 다 동시에 완료됨)
}

fetchData();

 


 

  • await는 async 함수 내부에서만 사용할 수 있음. 그렇지 않으면 문법 오류가 발생함.
  • 에러 처리를 위해 항상 try-catch를 사용하여 에러를 처리하는 것이 좋음.
  • 여러 비동기 작업을 동시에 처리할 때는 Promise.all()을 사용하여 성능을 최적화할 수 있음.

요약:

  • async: 비동기 함수임을 나타내며, 항상 Promise를 반환함.
  • await: 비동기 작업이 완료될 때까지 기다린 후 결과를 반환하며, 동기식 코드처럼 작성 가능함.
  • 장점: 가독성이 좋고, Promise보다 더 직관적인 비동기 처리 방식.

 

728x90
반응형

'Web Development' 카테고리의 다른 글

스코프 scope  (0) 2024.09.30
[콜럼Vue스]this  (0) 2024.09.30
동기(Synchronous) 비동기(Asynchronous)  (1) 2024.09.30
프레임워크 vs 라이브러리  (1) 2024.09.12
구글 코랩 한글 폰트 설치  (0) 2024.08.21