본문 바로가기
공부 기록

Promise

by 매트(Mat) 2020. 10. 22.

Promise

Promise는 자바스크립트에서 비동기를 간편하게 처리해줄 수는 있는 오브젝트입니다.
(콜백함수 대신에 유용하게 사용할 수 있습니다.)

Promise는 기능이 정상적으로 수행이 된다면 성공의 메시지로 처리된 결과값을 전달해주고,
만약 기능을 수행하다 예상치 못한 문제가 발생한다면 에러를 전달해줍니다.

염두에 둘 것.

  • State: pending 상태 -> fulfilled or rejected
  • Producer: 데이터를 만들어내는 프로듀서
  • Consumer: 데이터를 소비하는 컨슈머

pending: promise가 만들어져서 우리가 지정한 연산이 수행중일 때
fulfilled: 연산 수행이 완전히 끝날 때
rejected: 문제가 발생시

**만약 헤비한 코드를 수행하는데 동기적으로 처리하면 파일을 읽거나 네트워크에서 데이터를 받아오는 동안에 코드가 실행되지 않기 때문에 비효율적입니다.
따라서 promise를 만들어서 비동기적으로 처리합니다.

선언

const promis = new Promise((resolve, reject) => {
    // heavy work
    console.log('doing something');
});

주의

  • 이렇게 new Promise로 만드는 순간 우리가 전달한 executor 콜백함수가 바로 호출이 됩니다.
  • 따라서 만약 사용자가 요청을 할 때에만 응답을 해주어야 하는데 요청을 하지도 않았는데 응답해주는 난감한 상황이 올 수 있습니다.

Producer

const promis = new Promise((resolve, reject) => {
    // heavy work
    console.log('doing something');
    setTimeout(() => {
        resolve('minsu');
        //reject(new Error('no network'));
    }, 2000);
});
  • 2초뒤에 수행이 완전히 끝나면 resolve()함수 호출
  • 이렇게 데이터를 만드는 것 -> Producer

Consumer

promis.then((value) => {
    console.log(value);
    .then(value => {
        console.log(value);
    })
    .catch(error => {
        console.log(error);
    })
    .finally(() => {
        console.log('finally');
    });
})
  • then: 연산 수행이 정상적으로 끝나면. (그렇다면)
  • 콜백함수를 호출합니다. value의 값은 Producer에서 정상적으로 동작했는데 resolve()에서 전달한 값 'minsu'가 됩니다.
  • Producer에서 reject()를 전달하면 에러 메시지가 뜹니다.
  • catch()문을 사용하여 예외처리도 가능합니다.
  • 체이닝: then()사용하여 promise가 리턴되고 다시 리턴된 프로미스에 .(닷)으로 catch()를 사용하는 것
  • finally()를 사용하면 성공하든 실패하든 출력하게 됩니다. 즉, 어떤 기능 마지막으로 사용하고 싶은 때 이용하면 좋습니다.

'공부 기록' 카테고리의 다른 글

Eclipse 개발 환경 구축 (톰캣)  (0) 2021.05.20
async & await  (0) 2020.10.22
동기 & 비동기  (0) 2020.10.22
JavaScript에서 Getter와 Setter  (0) 2020.10.21
자바스크립트 기본2  (0) 2020.10.21

댓글