Promise 기본 개념부터 ~

Updated:

Categories:

Tags:

JavaScript의 Promise

  • 비동기 연산을 다루는 Promise
  • Promise는 CallBack 지옥에서 탈출하게 도와줄 수 있다
function delay(sec, callback) {
  setTimeout(() => {
    callback(new Date().toISOString());
  }, sec * 1000);
}

consloe.log('start', new Date().toISOString());

delay(1, (result) => {
  console.log("delay", result);
});

console.log('hello');

  • 위에 코드를 보면 실행 순서는 start -> hello -> delay 가 실행된다.
  • 순서를 보면 delay는 비동기라는걸 알 수 있다
  • 하지만 만약 1초단위로 출력하게 만든다면?
function delay(sec, callback) {
  setTimeout(() => {
    callback(new Date().toISOString());
  }, sec * 1000);
}

delay(1, (result) => {
  console.log(1, result);
});
delay(1, (result) => {
  console.log(2, result);
});
delay(1, (result) => {
  console.log(3, result);
});
  • 이런 코드로 실행한다고 하면 어떻게 실행이 될까?

  • 비동기일때 시작된 시간은 1, 2, 3의 시간은 비슷하고 1초후에 실행하는건 똑같지만 표현하는시간은 우리가 흔하게 생각하는 절차지향처럼 드라마틱하게 1이 실행되고 1초후에 2가 실행되거나 그렇지 않다.

만약 1실행하고 2실행하고 3실행을 했을때 1초단위로 나오게 유도하고 싶다면

function delay(sec, callback) {
  setTimeout(() => {
    callback(new Date().toISOString());
  }, sec * 1000);
}

delay(1, (result) => {
  console.log(1, result);
  delay(1, (result) => {
  console.log(2, result);
    delay(1, (result) => {
  console.log(3, result);
});
});
});
  • 콜백 안에 콜백을 넣게 된다면 내가 원하는 1초후에 1, 1초후에 2, 1초후에 3 이런식으로 출력하게 된다.

여기서 만약 코드를 잠깐 수정해보자

function delay(sec, callback) {
  setTimeout(() => {
    callback(new Date().toISOString());
  }, sec * 1000);
}

delay(1, (result) => {
  console.log(1, result);
  delay(1, (result) => {
    delay(1, (result) => {
 			console.log(3, result);
});
    console.log(2, result);
});
});
  • 마지막 3번 콜백 함수 밑에 console.log(2, result);를 한다고 했을땐 결과는 어떻게 나올까?

  • 사실은 맨 위에 코드랑 똑같이 작동을 한다. 하지만 여기서 문제가 되는건 사람은 보통 코드를 읽을때는 위에서 아래로 읽게 되는데, 이때 흐름상 3이 먼저 실행 되어야 할 것 같은 느낌인데 전혀 다른 결과가 나오게 된다

    이 문제를 해결하기 위해 나온게 Promise, async, await 이다

위에 코드를 Promise 형태로 구현해보자

function delay(sec, callback) {
  setTimeout(() => {
    callback(new Date().toISOString());
  }, sec * 1000);
}

delay(1, (result) => {
  console.log(1, result);
});

function delayP(sec) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
    resolve(new Date().toISOString());
  }, sec * 1000);
  })
}

delayP(1).then((result => {
  console.log(1, result);
}))
  • resolve
    • 할일을 다 했을때 호출하는 곳
  • reject
    • 할일을 하다가 예외가 발생했을 때 호출 하는 곳
  • Promise는 callback 과 다른건 resolve를 호출하게 되는데, 이때 resolve가 호출이 된다면 then((result) => {}) 함수에서 받는 result에 값을 넣어주게 된다. 이걸 실행해서 1초 후에 date가 출력하게 된다

br>

개인 공부 기록용 블로그입니다.
잘못된 내용이 있다면 꼭 알려주세요!

맨 위로 이동하기

JavaScript 카테고리 내 다른 글 보러가기