250x250
Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

진스

11. Promise 본문

JavaScript

11. Promise

입방정 2021. 4. 9. 17:48
728x90

Promise

  • 프로미스는 JS에서 제공하는 비동기 코드를 간편하게 처리할 수 있도록 도와주는 object 이다.
  • 프로미스는 어떤 기능을 실행하고 나서 정상적으로 동작하면, 성공의 메세지와 함께 처리된 결과값을 전달해줌, 그러나 기능을 수행하다 예상치 못한 문제가 발생하면 error를 전달해 준다.
  • State: pending(보류) → fulfilled(이행) or rejected(거부)
  • Produce vs Consumer

1. Producer (생산자)

  • 새 Promise가 생성되면 executor라는 콜백함수가 자동으로 실행됩니다. (코딩 할 때 조심!!)
const promise = new Promise((resolve, reject) => {
  // 시간이 오래 걸리는 무거운 처리 (network, read files ..)
  console.log(`doing something...`);
  setTimeout(() => {
    resolve(`ellie`); // 성공 하면
    // reject(new Error(`no network`)); // 실패 하면
  }, 2000);
});

2. Consumer (소비자)

  • then, catch, finally
promise
  .then((value) => {
    console.log(value);
  })
  .catch(error => {
    console.log(error);
  })
  .finally(() => { // 성공하든 실패하든 마지막에 실행됨
    console.log(`finally`);
  })

3. Promise chaining(연결하기)

  • then은 값을 바로 전달 할 수 도 있고, 리턴으로 Promise를 전달해도 된다.
const fetchNumber = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
});

fetchNumber
  .then(num => {
    return num * 2; // > 2
  })
  .then(num => num * 3) // > 6
  .then(num => { // > 5
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(num - 1), 1000);
    });
  })
  .then(num => console.log(num)); // > 5

4. Error handling

  • catch 로 error를 헨들링 할 수 있다
  • error가 발행해도 catch를 이용하면 전체적인 Promise 체인에 문제가 발생하지 않도록 빵꾸처리를 할 수 있다.
const getHen = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(`🐓`), 1000);
    // setTimeout(() => reject(new Error(`error! 🐓`)), 1000);
  });
};
const getEgg = hen =>
  new Promise((resolve, reject) => {
    // setTimeout(() => resolve(`${hen} => 🥚`), 1000);
    setTimeout(() => reject(new Error(`error! ${hen} => 🥚`)), 1000);
  });
const cook = (egg) => 
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${egg} => 🍗`), 1000);
    // setTimeout(() => reject(new Error(`error! ${egg} => 🍗`)), 1000);
  });

getHen()
  .catch(error => {
    console.log(error);
    return `💀`; // 빵꾸처리
  })
  .then(hen => getEgg(hen))
  .catch(error => {
    console.log(error);
    return `💀`; // 빵꾸처리
  })
  .then(egg => cook(egg))
  .catch(error => {
    console.log(error);
    return `💀`; // 빵꾸처리
  })
  .then(result => console.log(result))
  .catch(error => {
    console.log(error);
  })

// 정직한 코드
// getHen()
//   .then((hen) => {
//     return getEgg(hen);
//   })
//   .then((egg) => {
//     return cook(egg);
//   })
//   .then((result) => {
//     console.log(result);
//   })

// 파라미터가 1개일때 함수이름만 쓰면, 암묵적으로 함수의 매개변수로 전달 됨.
// getHen()
//   .then(getEgg)
//   .then(cook)
//   .then(console.log);

5. callback to promise

  • 콜백 지옥 코드 수정
  • 콜백함수를 인자로 전달 안해도 됨!!
'use strict';

class UserStorage {
  loginUser(id, password) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (
          (id === `ellie` && password === `123`) ||
          (id === `gunwoo` && password === `1104`)
        ) {
          resolve(id);
        } else {
          reject(new Error(`not found`));
        }
      }, 2000);
    });
  }

  getRoles(user) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (user === `ellie`) resolve({ name: `ellie`, role: `admin` });
        else reject(new Error(`no access`));
      }, 1000);
    });
  }
}

const id = prompt(`enter your id`);
const password = prompt(`enter your password`);

const userStorage = new UserStorage();
userStorage // 겁나 깔끔 😋
  .loginUser(id, password)
  .then(user =>  userStorage.getRoles(user))
  .then(userInfo => alert(`name: ${userInfo.name}, role: ${userInfo.role}`))
  .catch(error => console.log(error));
728x90

'JavaScript' 카테고리의 다른 글

웹에서 다크 모드로 토글 (css 변수 이용)  (0) 2021.04.14
12. async / await  (0) 2021.04.09
10. Callback 지옥  (0) 2021.04.09
9. JSON  (0) 2021.04.09
8. Array(2) (퀴즈문제)  (0) 2021.04.09
Comments