Study/JavaScript

[JS] 프로미스(Promise)

taecongs 2023. 9. 1. 17:40

알고있으면 좋은 Javascript Tip✨


프로미스 (Promise)

  • 자바스크립트는 비동기 처리를 위해 콜백함수를 사용한다.
  • 하지만 콜백을 너무 남용하게 되면 우리가 흔히 부르는 콜백 지옥에 빠질 수 있다.
  • 이런 콜백 함수의 단점을 보완하며 비동기 처리에 사용되는 객체를 프로미스 (Promise)라 한다.

(1) 프로미스(Promise)를 사용하면 다음과 같은 이점은?

  • 비동기 처리 시점을 명확하게 표현 할 수 있다.
  • 연속된 비동기 처리 작업을 수정, 삭제, 추가하기 편하고 유연하다.
  • 비동기 작업 상태를 쉽게 확인 할 수 있다.

(2) 프로미스(Promise)의 진행 방식은?

  • 프로미스 객체를 생성하여 비동기 작업이 완료되면 성공(resolve)실패(reject)에 대한 결과값을 인자 값으로 받으며, 성공시 then 메서드를 실행하고 실패시 catch 메서드를 실행한다.
  • 후속 처리 메서드(then, catch)를 통해 비동기 처리 결과 또는 에러 메세지를 전달받아 처리한다.

(3) 프로미스(Promise)는 객체가 생성되고 종료될 때까지 3가지 상태를 갖는다.

  • Pending(대기) : 비동기 로직 처리의 미완료 상태
  • Fulfilled(이행) : 비동기 로직 처리가 완료된 상태로 Promise 결과값 반환 상태
  • Rejected(실패) : 비동기 로직 처리의 실패 또는 오류 상태

 

Pending(대기)

  • Promise 객체를 생성하면 대기(Pending) 상태이다.
new Promise((resolve, reject) => {});
  • new Promise() 메서드 호출 시 콜백 함수를 선언할 수 있으며, 인자는 resolve와 reject이다.
  • 인자(Argument) : 함수를 호출할 때 전달되는 실제 값이다.

Fulfilled(이행)

  • 콜백 함수 인자인 resolve를 실행하면 이행된(Fulfilled) 상태이다.
  • 이행된 상태를 다른 말로 완료된 상태라고도 한다.
new Promise(function(resolve, reject) {
  resolve();
});
  • 이행 상태가 되면 then()을 활용하여 결괏값을 받을 수 있다.
function getData(){
    return new Promise( (resolve, reject) => {
      let data = 10;
      resolve(data);
    })
  }
  
getData().then((resolvedData) => console.log(resolvedData));

// 실행결과
10
  • then() 메서드가 호출되면 새로운 Promise 객체가 반환된다.
  • then() 메서드를 활용하여 여러 Promise 객체를 연결할 수 있으며, then() 메서드 활용 개수 제한은 없다.

Rejected(실패)

  • Promise 객체의 인자인 reject는 호출 시 실패(Rejected) 상태가 된다.
new Promise(function(resolve, reject) {
  reject();
});
  • resolve와 마찬가지로, 실패 상태가 되면 catch()를 활용하여 결과값을 받고 예외 처리할 수 있다.
function getData(){
    return new Promise( (resolve, reject) => {
      reject(new Error("This is rejected!"));
    })
  }
  
getData().catch((err) => console.log(err));

'Study > JavaScript' 카테고리의 다른 글

[JS] 콜백 함수 (Callback Function)  (0) 2023.09.01
[JS] async & await  (0) 2023.09.01
[JS] JSON & JSON.stringify & JSON.parse  (0) 2023.08.31
[JS] setTimeout & setInterval  (0) 2023.08.31
[JS] flat & flatMap  (0) 2023.08.30