JS

프로미스(Promise)🫵🏻

나미쓰 ㅣ 2024. 8. 18. 18:12

* 해당 자료는 MDN 을 참고하여 작성하였습니다

1.  Promise란?

Promise는 비동기 연산이 종료된 이후에 결과 값과 실패 사유를 처리하기 위한 처리기를 연결할 있습니다. 프로미스를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 있습니다. 다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '프로미스(promise)' 반환합니다.

 

 * Promise 의 상태

  • 대기(pedding) : 완전 초기 단계, 실행을 하지 않아 값이 없는 상태
  • 이행(fulfield) : 연산이 되고 값이 있는 상태(값o , 값x)
  • 거부(rejected) : 연산이 실패(반환) => reject

promise logic (참조 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise)

 

2. Promise가 필요한 이유😆

프로미스는 주로 서버에서 받아온 데이터를 화면에 표시할 사용합니다. ‘데이터 하나 보내주세요라는 요청을 보내죠. 그런데 여기서 데이터를 받아오기도 전에 마치 데이터를 받아온 마냥 화면에 데이터를 표시하려고 하면 오류가 발생하거나 화면이 뜹니다. 이와 같은 문제점을 해결하기 위한 방법 하나가 프로미스입니다.

 

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

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

3. Promise Chaining

then() , catch() , finally() 의 메서드는 정착된 정보를 순차적으로 추가 작업 하는데 사용됩니다. 이러한 메서드는 연쇄적으로 연결 할 수 있습니다. 

메서드는 최대 두 개의 인수를 받습니다. 첫 번째 인수는 프로미스의 이행된 경우에 대한 콜백 함수이고, 두 번째 인수는 거부된 경우에 대한 콜백 함수입니다. 각  .then() 은 새로 생성된 프로미스 객체를 반환하며, 선택적으로 연쇄에 사용할 수 있습니다.
const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("foo");
  }, 300);
});

myPromise
  .then(handleFulfilledA)
  .then(handleFulfilledB)
  .then(handleFulfilledC)
  .catch(err => {
  	console.errro(err);
  })

 

* Promise의 instance

  • Promise.prototype.catch()
     프로미스에 거부 처리기 콜백을 추가하고, 콜백이 호출될 경우 그 반환값으로 이행하며 호출되지 않을 경우, 즉 이전 프로미스가 이행하는 경우 이행한 값을 그대로 사용해 이행하는 새로운 프로미스를 반환합니다.
  • Promise.prototype.finally()
    프로미스의 이행과 거부 여부에 상관없이 처리될 경우 항상 호출되는 처리기 콜백을 추가하고, 이행한 값 그대로 이행하는 새로운 프로미스를 반환합니다.
  • Promise.prototype.then():
    프로미스에 이행과 거부 처리기 콜백을 추가하고, 콜백이 호출될 경우 반환값으로 이행하며 호출되지 않을 경우(onFulfilled, onRejected  상태에 맞는 콜백이 함수가 아닐 경우) 처리된 값과 상태 그대로 처리되는 새로운 프로미스를 반환합니다.
let myFirstPromise = new Promise((resolve, reject) => {
  // 우리가 수행한 비동기 작업이 성공한 경우 resolve(...)를 호출하고, 실패한 경우 reject(...)를 호출합니다.
  // 이 예제에서는 setTimeout()을 사용해 비동기 코드를 흉내냅니다.
  setTimeout(function () {
    resolve("성공!"); // 와! 문제 없음!
  }, 250);
});

myFirstPromise.then((successMessage) => {
  // successMessage는 위에서 resolve(...) 호출에 제공한 값입니다.
  // 문자열이어야 하는 법은 없지만, 위에서 문자열을 줬으니 아마 문자열일 것입니다.
  console.log("와! " + successMessage);
});