자바스크립트

[JavaScript] Promise 정복하기

코딩하는둥이 2025. 2. 14. 13:56

Promiss란?

 : 객체이 비동기 작업이 맞이할 때 미래의 완료 또는 실패와 그 결과 값을 나타낸다.

  

promise는 하나의 상태를 가지게 되는데 대기, 이행, 거부로 세가지로 나눠져있다.

 

 1) 대기(pending): 이행하지도, 거부하지도 않은 초기상태

      -> then 메서드에 의해 대기열에 추가된 처리기들이 호출

 

 2) 이행(fulfilled): 연산이 성공적으로 완료됨

      ->  promise.prototype.then()

let promiseResolve = Promise.resolve('성공');

promiseResolve
  .then((resolve) => {
    console.log('1회'+resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('2회'+resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('3회'+resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log(resolve);
  });

 

 

3) 거부(rejected): 연산이 실패

      -> promise.prototype.catch()

let promiseResolve = Promise.resolve('성공');
let promiseReject = Promise.reject('실패');

promiseResolve
  .then((resolve) => {
    console.log('1회' + resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('2회' + resolve);
    return promiseReject;
  })
  .then((resolve) => {
    console.log('3회' + resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('4회' + resolve);
    return promiseResolve;
  });

 

reject를 사용하고 싶다면 catch를 사용해야 한다.

let promiseResolve = Promise.resolve('성공');
let promiseReject = Promise.resolve('실패');

promiseResolve
  .then((resolve) => {
    console.log('1회' + resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('2회' + resolve);
    return promiseReject;
  })
  .catch((reject) => {
    console.log('3회' + resolve);
    return promiseResolve;
  })
  .then((resolve) => {
    console.log('4회' + resolve);
    return promiseResolve;
  });

 

 

new 사용해보기

 : 일반적으로 promise 앞에 new가 붙고 새로운 객채를 생성하고 resolve 또는 reject 두 개의 결과값을 불러올 수 있다.

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("완료"), 1000);
})
const one = Promise.resolve('1');
const two = new Promise((resolve) =>
    setTimeout(()=> {
    resolve('2');
    }, 2000)
);
const three = Promise.resolve('3');

one
    .then((oneRes) => {
    console.log(oneRes);
    return two;
})
.then((twoRes)=>{
    console.log(twoRes);
    return three;
})
.then((threeRes)=>{
    console.log(threeRes);
    }).finally(() => console.log('end')
);

setTimeout(() => {}, 1000);

 

 

 

 

delay 인자를 사용해서 실행 시작하는 시간을 부여할 수 있다.

const one = Promise.resolve('1');
const two = (delay) => new Promise((resolve) =>
setTimeout(()=> {
resolve('2');
}, delay)
);
const three = Promise.resolve('3');

one
.then((oneRes) => {
console.log(oneRes);
return two(3000);
})
.then((twoRes)=>{
console.log(twoRes);
return three;
})
.then((threeRes)=>{
console.log(threeRes);
}).finally(() => console.log('end'));

setTimeout(() => {}, 1000);

 

 

 

응용해보자!

const starbucks = function(coffeeName){
    return new Promise((resolve, reject) => {
        if(coffeeName === '아아'){
            resolve('아아 드리겠습니다.');
        } else {
            reject('메뉴에 없습니다');
        }
    });
}

starbucks('아아')
    .then((res) => console.log(res))
    .catch((rej) => console.log(rej))
    .finally(() => console.log('감사합니다'));

 

 

 

 

async await 사용하기 

 

: async를 사용하면 promise 생성 함수가 아니어도 반환되는 값을 promise 객페에 넣는다

   await를 사용하면 promise의 상태가 바뀔때까지 코드가 기다린다.

    => promise가 성공 상태 또는 실패 상태로 바뀌기 전까지는 다음 연산을 시작하지 안한다.

const starbucks = function(coffeeName){
    return new Promise((resolve, reject) => {
        if(coffeeName === '아아'){
            resolve('아아 드리겠습니다.');
        } else {
            reject('메뉴에 없습니다');
        }
    });
}

async function americano(someDrink) {
    try{
        const result = await starbucks(someDrink);
    }
    catch(error){
        console.log(error);
    }
    finally{console.log('감사합니다');
    }
    
}
americano('뜨아');