ES6 프로미스 기초 및 활용

프로미스는 비동기 작업의 결과를 관리하는 객체로, 콜백 함수 대신 사용하여 코드 가독성을 높입니다.

기존의 콜백 방식 예시

{
  const fetchData = callback => {
    console.log('작업 시작');
    setTimeout(() => {
      callback && callback();
    }, 1000);
  }

  fetchData(() => {
    console.log('타임아웃 완료');
  });
}

ES6 프로미스 사용 예시

{
  const fetchData = (name) => {
    console.log('작업 시작');
    return new Promise((success, failure) => {
      setTimeout(() => {
        success(name);
      }, 1000);
    });
  }
  fetchData('완료').then(result => {
    console.log(result);
  });
}

프로미스 체이닝과 에러 처리

{
  const validateNumber = num => {
    return new Promise((success, failure) => {
      if (num > 0) {
        success(num);
      } else {
        failure(new Error('음수 입력'));
      }
    });
  }
  validateNumber(2).then(r => {
    console.log(r);
  }).catch(err => {
    console.error(err.message);
  });
  validateNumber(-2).then(r => {
    console.log(r);
  }).catch(err => {
    console.error(err.message);
  });
}

이 예제는 숫자가 0보다 클 때 정상 처리, 작을 때 에러 발생을 보여줍니다. then과 catch를 통해 체인 처리가 가능합니다.

프로미스의 두 가지 주요 메서드

all 메서드는 모든 비동기 작업이 완료된 후 콜백 실행, 일반적으로 이미지 로딩 시 사용됩니다.

{
  function createImage(src) {
    return new Promise((success, failure) => {
      const img = document.createElement('img');
      img.src = src;
      img.onload = () => success(img);
      img.onerror = () => failure('이미지 로딩 실패');
    });
  }

  function displayImages(images) {
    images.forEach(img => {
      console.log(img.src);
      document.body.appendChild(img);
    });
  }

  Promise.all([
    createImage('http://pic.baike.soso.com/ugc/baikepic2/14871/20170111115043-89387261.jpg/0'),
    createImage('http://pic9.photophoto.cn/20081105/0036036315103765_b.jpg'),
    createImage('http://tpic2.eastlady.cn/uploads/tu/201710/161/S1.jpg')
  ]).then(displayImages);
}

이 코드는 3개의 이미지가 모두 로딩된 후 화면에 표시합니다.

race 메서드는 가장 먼저 완료된 비동기 작업의 결과를 처리합니다.

{
  function createImage(src) {
    return new Promise((success, failure) => {
      const img = document.createElement('img');
      img.src = src;
      img.onload = () => success(img);
    });
  }

  function timeoutPromise() {
    return new Promise((success, failure) => {
      setTimeout(() => {
        success('시간 초과');
      }, 5000);
    });
  }

  Promise.race([
    createImage('http://tpic2.eastlady.cn/uploads/tu/201710/161/S1.jpg'),
    timeoutPromise()
  ]).then(result => {
    console.log(result);
  });
}

이 예제는 이미지 로딩과 시간 초과 중 먼저 완료된 작업을 처리합니다.

태그: JavaScript Promises asynchronous programming ES6 Async/Await

7월 25일 23:57에 게시됨