업데이트:

기본문법

var promise = new Promise(function(resolve, reject){…});

  • resolve : 함수 안의 처리가 끝났을 때 호출해야 하는 콜백함수. resolve 함수에는 어떠한 값도 인수로 넘길 수 있음. 이 값은 다음 처리를 실행하는 함수에 전달된다.
  • reject : 함수 안의 처리가 실패했을 때 호출해야 하는 콜백함수. reject 함수에는 어떠한 값도 인수로 넘길 수 있음. 대부분의 경우 오류 메시지 무자열을 인수로 사용한다.

예1) then(성공했을때)과 catch(실패했을 때)문

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    var n = parseInt(prompt("10미만의 숫자를 입력하시오"));
    if (n <= 10) {
      resolve(n);
    } else {
      reject(`오류: ${n}은 10이상입니다.`);
    }
  }, 1000);
});
promise
  .then(function(num) {
    console.log(num);
  })
  .catch(function(error) {
    console.log(error);
  });

예2) then(resolve, reject)를 catch문 없이 동시에 구현가능.

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    var n = parseInt(prompt("10미만의 숫자를 입력하시오"));
    if (n <= 10) {
      resolve(n);
    } else {
      reject(`오류: ${n}은 10이상입니다.`);
    }
  }, 1000);
});
promise.then(
  function(num) {
    console.log(num);
  },
  function(error) {
    console.log(error);
  }
);

Promise 콜백함수에 인수 넘기기 ( + 메서드체인)

function buyAsync(mymoney) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      var payment = parseInt(prompt("지불하고자 하는 금액을 입력하십시오"));
      var balance = mymoney - payment;
      if (balance > 0) {
        console.log(`${payment} 원을 지불햇습니다.`);
        resolve(balance);
      } else {
        reject(`잔액은 ${mymoney}원 입니다. 구매할 수 없습니다.`);
      }
    }, 1000);
  });
}

buyAsync(500)
  .then(function(balance) {
    console.log(`잔액은 ${balance}원 입니다.`);
    return buyAsync(balance);
  })
  .then(function(balance) {
    console.log(`잔액은 ${balance}원 입니다.`);
    return buyAsync(balance);
  });

병렬로 실행하는 Promise.all과 Promise.race 메서드

  • Promise.all : 모든 실행함수가 resolve로 종료되면, response 배열이 반환됨.
  • Promise.race : 먼저 종료한 작업이 성공 또는 실패 콜백을 호출하고 결과값을 반환. 나머지 작업은 실행만 함.
function buyAsync(name, mymoney) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      var payment = parseInt(
        prompt(`${name}님, 지불하고자 하는 금액을 입력하십시오`)
      );
      var balance = mymoney - payment;
      if (balance >= 0) {
        console.log(`${name} : ${payment} 원을 지불햇습니다.`);
        resolve(balance);
      } else {
        reject(`${name} : 잔액은 ${mymoney}원 입니다. 구매할 수 없습니다.`);
      }
    }, 1000);
  });
}

Promise.all([
  //or race
  buyAsync("Tom", 500),
  buyAsync("Huck", 1000),
  buyAsync("Becky", 600)
])
  .then(function(balance) {
    console.log(balance);
  })
  .catch(function(error) {
    console.log(error);
  });

//Promise.all 결과
//Tom : 100 원을 지불햇습니다.
//Becky : 100 원을 지불햇습니다.
//Huck : 100 원을 지불햇습니다.
//(3) [400, 900, 500]

//Promise.race 결과
//Tom : 400 원을 지불햇습니다.
//100
//Huck : 400 원을 지불햇습니다.
//Becky : 400 원을 지불햇습니다.

callback이란?

함수를 인수로 받아서 처리하는 방식으로, 이러한 패턴이 깊어지면 가독성이 떨어져 callback 지옥이라 함.

firstFunction(args, function() {
  secondFunction(args, function() {
    thirdFunction(args, function() {
      // And so on…
    });
  });
});

Promise 장점

  • 가독성이 떨어질수 있는 콜백 지옥을 피할 수 있다.
  • then() 을 이용하여 가독성 좋은 연속적인 비동기 코드를 쉽게 작성할 수 있다.
  • Promise.all() 을 사용하여 병렬 비동기 코드를 쉽게 작성할 수 있다.
  • Promise를 통해 콜백만 사용하는 코딩 방식에 있는 다음과 같은 상황이 발생하지 않습니다.
    • 콜백을 너무 빨리 호출함.
    • 콜백을 너무 늦게 호출하거나 호출하지 않음
    • 콜백을 너무 적게 호출하거나 너무 많이 호출함
    • 필요한 환경/매개벼누를 전달하는데 실패함
    • 발생가능한 오류/예외를 무시함

댓글남기기