개요

이전에 살펴봤던 콜백 지옥의 문제를 해결하기 위해 Promise라는 개념이 나왔다. 실제 쓰임과 동작도 그 이름 그대로다.

개념

const a = () => {
  setTimeout(()=> {
    console.log(1);
  }, 1000)
}

const b = () => console.log(2);

a();
b();

// 2
// 1

이전의 콜백 패턴을 프로미스를 사용해서 수정해보면…

const a = () => {
  return new Promise(resolve => {
    setTimeout(()=> {
    console.log(1)
    resolve()
  }, 1000)
  });
}

const b = () => console.log(2);

a().then(() => {b()})

중첩된 콜백을 작성해보면…

const a = () => {
  return new Promise(resolve => {
    setTimeout(()=> {
    console.log(1)
    resolve()
  }, 1000)
  });
}
const b = () => {
  return new Promise(resolve => {
    setTimeout(()=> {
    console.log(2)
    resolve()
  }, 1000)
  });
}
const c = () => {
  return new Promise(resolve => {
    setTimeout(()=> {
    console.log(3)
    resolve()
  }, 1000)
  });
}

const d = () => console.log(4);

a().then(() => {
  return b()
})

이렇게 작성했는데 여전히 콜백지옥과 같이 유지보수가 곤란한 구조가 만들어졌다.

프로미스는 메소드 체이닝 방식으로 이어서 작성할 수 있다. 프로미스가 반환되는 구조에선 then을 연속해서 사용할 수 있다.

a().then(() => {
  return b()
}).then(() => {
  return c()
}).then(() => {
  d()
})

이전의 콜백지옥보단 훨씬 정돈된 코드가 된다.
화삺표 함수 다음에 바로 리턴 키워드가 나오면 이를 생략할 수 있다. 한 번 더 정돈을 해보면…

a()
  .then(() => b())
  .then(() => c())
  .then(() => {
    d()
  })
a()
  .then(b)
  .then(c)
  .then(d)

이전의 계속해서 안으로 들어가던 콜백 지옥에서 메소드 체이닝 방식으로 단순해졌다.