JavaScript

Promise

Mia_ 2022. 11. 22. 21:05

Promise

: A promise is an object that may produce a single value some time in the future

프로미스는 자바스크립트 비동기 처리에 사용되는 객체

 

 

프로미스의 3가지 상태 (처리 과정)

- Pending (대기) : 비동기 처리 로직이 아직 완료되지 않은 상태

- Fulfilled (이행) : 비동기 처리가 완료되어 프로미스가 결과 값을 반환해 준 상태

- Rejected (실패) : 비동기 처리가 실패하거나 오류가 발생한 상태

 

 

Pending (대기)

- new Promise() 매서드를 호출할 때 콜백 함수를 선언할 수 있음

- 콜백 함수 인자는 resolve, reject 

new Promise(function(resolve, reject){
	// ...
});

 

Fulfilled (이행)

- 콜백 함수의 인자 resolve를 아래와 같이 실행하면 이행(Fulfilled) 상태가 됨

- 그리고 이행 상태가 되면 then()을 이용해서 처리 결과 값을 받을 수 있음

- then()은 resolve()에 전달 인자로 넣어준 값을 리턴함!

new Promise(function(resolve, reject) {
  resolve();
});

 

Rejected (실패)

- reject를 호출하면 실패(Rejected) 상태가 됨

- 실패 상태가 되면 실패한 이유(실패 처리 결과 값)를 catch() 로 받을 수 있음

- catch()는 reject()에 전달 인자로 넣어준 값을 리턴함!

new Promise(function(resolve, reject) {
  reject();
});

 

 

promise 처리 흐름 - 출처 : MDN


Promise.prototype.then()

- then() 메서드는 Promise를 리턴하고 두 개의 콜백 함수를 인수로 받음

- 하나는 Promise가 이행했을 때, 다른 하나는 거부했을 때를 위한 콜백 함수

p.then(onFulfilled, onRejected);

p.then(function(value)){
  // 이행
}, function(reason){
  // 거부
});

- 매개 변수

onFulfilled: Promise가 수행될 때 호출되는 Function으로, 이행 값 하나를 인수로 받음

onRejected : Promise가 거부 될 때 호출하는 Function으로, 거부 이유 하나를 인수로 받음


Promise.prototype.catch()

: the catch() method returns a Promise and deal with rejected cases only.

 

p.catch(onRejected)

p.catch(function(reason) {
  // rejection
})

여러 개의 프로미스 연결하기 (Promise Chaining)

- then() 메서드를 호출하고 나면 새로운 프로미스 객체가 반환 아래의 형식 참고

function getData() {
  return new Promise({
    // ...
  });
}

// then() 으로 여러 개의 프로미스를 연결한 형식
getData()
  .then(function(data) {
    // ...
  })
  .then(function() {
    // ...
  })
  .then(function() {
    // ...
  });

- 프로미스 객체 하나를 생성하고 setTimeout()을 이용해 2초 후에 resolve()를 호출하는 예제

- resolve()가 호출되면 프로미스가 대기 상태에서 이행 상태로 넘어가기 때문에 첫번째 .then() 로직으로 넘어감

- 첫 번째 ,then()에서는 이행된 결과 값 1을 받아서 그 다음 .then() 으로 넘겨줌

- 두 번째 .then()에서도 바로 이전 프로미스의 결과 값 11을 받아서 20을 더하고 다음 .then()으로 넘겨 줌

- 마지막 .then()에서 최종 결과 값 31 출력