Javascript

프로미스와 async/await

index.ys 2023. 7. 26. 15:53

프로미스

  • 프로미스는 자바스크립트에서 비동기 작업을 다루는 객체로써, 비동기 작업이란 네트워크 요쳥, 데이터 베이스 쿼리, 파일 조작,DOM 등 시간이 오래걸리거나 완료까지 시간이 불확실한 작업
  • 비동기 작업은 자바스크립트 엔진이 아닌 백그라운드에서 실행되며, 자바스크립트가 코드를 백그라운드에서 동시에 처리할 수 있도록 하는 작업
  • 처리가 지연되는 요청들을 동기적으로 처리하면 다음 작업 처리까지 작업이 블로킹 되기 때문에 백그라운드에서 비동기적으로 처리하여 블로킹하지 않고 비동기적으로 처리하는 것이 포인트

프로미스 3가지 상태

  • 대기(pending): 비동기 작업이 진행 중인 상태
  • 이행(fulfiled) : 비동기 작업이 성공적으로 완료된 상태.
  • 거부(rejected): 비동기 작업이 실패한 상태
const myPromise = new Promise((resolve, reject) => {
  // 비동기 작업 수행
  // 성공적으로 작업이 완료되면 resolve(value) 호출
  // 작업이 실패하면 reject(error) 호출
});

async/await

  • async/await은 프로미스를 기반으로한 비동기작업을 보다 간결하고 동기적으로 코드를 작성할 수 있게 해주는 문법
  • async키워드로 함수앞에 비동기 함수임을 선언함
  • 함수내부에서 await 키워드를 사용하여 프로미스를 처리, await은 프로미스가 이행될때 까지 기다린 다음, 프로미스의 결과값을 변환함
// 비동기 작업을 수행하는 함수 (프로미스를 반환하는 함수)
function fetchData() {
  return new Promise((resolve, reject) => {
    // 비동기 작업 시뮬레이션 (1초 후 데이터 반환)
    setTimeout(() => {
      const data = { name: "John", age: 30 };
      resolve(data); // 성공적으로 작업 완료
      // reject(new Error("Failed to fetch data")); // 작업 실패
    }, 1000);
  });
}

// async 함수에서 await를 사용하여 fetchData 함수 호출
async function getData() {
  try {
    const result = await fetchData();
    console.log("Data:", result);
  } catch (error) {
    console.error("Error:", error.message);
  }
}

getData(); // getData 함수 호출

클로져

  • 함수가 자신이 선언될 떄의 환경(스코프)을 기억하여 이후에 호출될 때에도 그 환경에도 접근할 수 있도록함
  • 클로저는 함수와 그 함수가 선언된 렉시컬 스코프의 조합
  • 렉시컬 스코프는 함수가 선언될때 함수가 속한 스코프를 의미함
  • 함수 내부에서 정의된 함수가 외부 함수의 변수에 접근할 때 클로저가 형성됨
function outerFunction() {
  const outerVariable = 'I am from the outer function';

  function innerFunction() {
    console.log(outerVariable); // 클로저: innerFunction은 외부 함수인 outerFunction의 변수에 접근할 수 있음
  }

  return innerFunction;
}

const closureExample = outerFunction();
closureExample(); // 출력: "I am from the outer function"