ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [모각코 23-1] 7회차- 프로미스 객체
    학교생활/23-1 '모여서 각자 코딩' 2023. 5. 15. 10:18
    728x90

    콜백 안에 콜백 안에 콜백 안에 콜백 …. =>  콜백 지옥
    콜백을 사용했을 때의 복잡함을 피하기 위해, ES6부터 “프로미스(promise)” 등장

     

    처리에 성공했을 때 실행할 함수와 성공하지 못했을 때 실행할 함수를 미리 약속하자는 것이다.

    프로미스는 객체를 생성하는 부분과 소비하는 부분으로 나뉜다.

     

    먼저, 프로미스를 사용하려면 Promise 객체를 먼저 만들어야 한다. 생성!
    성공했을 때 실행할 함수 resolve()와 실패했을 때 실행할 함수 reject()도 함께 지정해야 한다.

     

    let likePizza = true;
    const pizza = new Promise((resolve, reject) => {
       if (likePizza) 
          resolve('피자를 주문합니다.');
       else
          reject('피자를 주문하지 않습니다.');
    });

     

    프로미스 제작 코드에서 ‘성공'과 ‘실패’를 확인한 후 소비 코드로 알려준다. 

    소비코드는 다음 세 함수를 사용하게 된다.

    • then() – 프로미스에서 성공했다는 결과를 보냈을 때 실행할 소스
    • catch() – 프로미스에서 실패했다는 결과를 보냈을 때 실행할 소스
    • finally() – 프로미스의 성공과 실패에 상관없이 실행할 소스
    pizza
      .then (
         result => console.log(result)
      )
      .catch (
        err => console.log(err)
      )
      .finally (
        () => console.log(“완료”)
      );

     

    첫번째 코드블럭의 likePizza 가 true 이면.. 

    피자를 주문합니다.

    완료

     

    false 이면..

    피자를 주문하지 않습니다.

    완료

     

    가 출력된다.

     


    프로미스의 상태
    • pedding : 처음 프로미스를 생성하면 이 상태가 된다.
    • fulfilled : resolve() 를 수행하면 이 상태가 된다.
    • rejected: reject() 를 수행하면 이 상태가 된다.

    제작코드에서는  fulfilled 상태인지, reject 상태인지에 따라 ‘피자를 주문합니다.’ 또는 ‘피자를 주문하지 않습니다.’라는 결괏값을 넘겨준다. 
    소비코드에서는 결괏값을 result나 err 같은 변수 이름으로 받아서 사용한다. 

     


    맨 처음에 콜백지옥을 벗어난 프로미스라고 했는데,

    어떻게 콜백 지옥을 벗어나냐...

    프로미스 체이닝

    A.then(B).then(C)

    then() 함수는 이전 프로미스의 결괏값을 받아서 다른 함수로 연결한다.

    const pizza = () => {
     return new Promise((resolve, reject) => {
       resolve("피자를 주문합니다.");
     });
    };
    
    const step1 = (message) => {
      console.log(message);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('피자 도우 준비');
        }, 3000);
      });
    };
    
    const step2 = (message) => {
      console.log(message);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('토핑 완료');
        }, 1000);
      });
    };
    
    const step3 = (message) => {
      console.log(message);
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('굽기 완료');
        }, 2000);
      });
    };

    피자를 만드는데에 이러한 순서의 코드가 필요하다고 해보자.

    대충.. 피자 주문하기 -> 도우 준비(step1) -> 토핑 완료(step2) -> 굽기 완료(step3) 의 순서로 진행되어야 한다.

     

    pizza()
      .then((result) => step1(result))
      .then((result) => step2(result))
      .then((result) => step3(result))
      .then((result) => console.log(result)) 
      .then(() => {
        console.log('피자가 준비되었습니다.');
      });

     

    여기서 더 줄일 수 있다!

    pizza()
     .then(step1)
     .then(step2)
     .then(step3)
     .then(console.log)
     .then(() => {
       console.log("피자가 준비되었습니다.");
     });
    728x90
Designed by Tistory.