본문 바로가기
JavaScript

promise

by 갈잃자 2023. 5. 10.

promise란

비동기를 간편하게 처리할 수 있도록 도와주는 js에 있는 Object

정상적으로 기능이 수행 되어졌다면, 처리된 결과값을 전달한다

문제가 발생했다면 에러를 전달한다

 

 

promise에 중요한 2가지

1. state

2. producer, consumers

 

state는 3가지로 나뉜다.

1. pending: promise가 만들어져서 지정한 동작이 수행중일때 상태

2. fulfilled: 동작이 성공적으로 끝난 상태

3. rejected: file을 찾을 수 없거나 network에 문제가 생긴 상태


예제를 통해 보는게 더욱 편리할 수 있음 아래는 예제

 

1. promise 생성하기

// 1. producer (promise 생성하기)
// promise는 생성한 순간, executor 가 자동적으로 실행됨
// resolve는 promise가 성공했을 시 값을 가져오고, reject는 실패했을 시 이유를 가져온다.
const promise = new Promise((resolve, reject) => {
    // promise는 따로 선언하지 않아도, 바로 실행 됨
    // 
    console.log('doing something...');
    setTimeout(() => {
        // resolve('ellie')
        reject(new Error('no network'))
    },2000)
})

2. promise 사용하기

//2. consumers (promise 사용하기) : then, catch, finally 등을 이용하여 값을 가져올 수 있음

// then은 promise에서 성공한 resolve에 들어가는 인자를 가져올 때 사용된다.
// catch는 promise에서 실패시 일어나는 이유를 다루는 reject에 들어가는 인자를 가져옴
// finally는 성공하던 실패하던 마지막에 호출되어지는 아이

promise
  .then((value) => {
    console.log(value)
})
  .catch(error => {
    console.log(error)
  })
  .finally(() => {
    console.log('finally')
  })

3. promise 연결하기

  //3. promise chaining (promise 연결하기)
  // then은 resolve의 인자 뿐만 아니라, 그것을 다루는 또 다른 promise를 선언하고 사용 가능하다.
  const fetchNumber = new Promise((resolve, reject) => {
    setTimeout(() => resolve(1), 1000)
  })

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

4. 오류 처리하기

//4. error handling (오류 처리 방법)

const getHen = () => 
    new Promise((resolve, reject) => {
        setTimeout(() => resolve('닭'), 1000);
    });

const getEgg = hen => 
    new Promise((resolve, reject) => {
        setTimeout(() => reject( new Error(` error! ${hen} => 달걀`)), 1000)
    })

const cook = egg => 
    new Promise((resolve, reject) => {
        setTimeout(() => resolve(`${egg} => 후라이`), 1000)
    })

getHen()
  .then(hen => getEgg(hen))
  // 만약 에러를 보이지 않고, 전체 로직을 돌게 하고 싶다면, 이렇게도 해결 가능
  .catch(error => {
    return '빵';
  })
  .then(egg => cook(egg))
  .then(meal => console.log(meal))
  .catch(error => console.log(error))

출처: https://www.youtube.com/watch?v=JB_yU6Oe2eE 

 

'JavaScript' 카테고리의 다른 글

자주 쓰이는 배열 APIs  (0) 2023.05.12
async-await  (0) 2023.05.11
js 동작원리 와 eventLoop  (0) 2023.05.09
동기와 비동기  (0) 2023.05.08
[JS]fetch()함수로 API 호출  (0) 2022.11.25

댓글