async 와 await 없이 비동기를 처리. 2017년
promise 의 then 2015년
// then 은 resolve 되면 실행된다.
function a() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('A')
      resolve()
    }, 1000);
  })
}

function b() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('B')
      resolve()
    }, 1000);
  })
}

function c() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('C')
      resolve()
    }, 1000);
  })
}

function test() {
  a().then(() => {
    b().then(() => {
      c()
    })
  })
}

test()

// **콜백지옥과 매우 유사하다!!**

// ****test를 약간 개선 해 보면
// 화살표 함수 내부에서 별다른 로직 없이 단일코드가 return 코드와 사용되면
// 중괄호와 return 생략

function test() {
  a()
  .then(() => b())
  .then(() => c())
}
// catch 는 reject 되면 실행된다.
// finally 는 resolve 되던 reject 되던 항상 실행된다.
function a(number) {
  return new Promise((resolve, reject) => {
    if(number > 4) {
      reject('pass Error msg!')
    }
    setTimeout(() => {
      console.log('A')
      resolve('pass msg!')
    }, 1000);
  })
}

function test() {
  a(2)
    .then((msg) => {
      console.log('Resolve : ', msg)
    })
    .catch((msg) => {
      console.log('Reject : ' , msg)
    })
    .finally(() => {
      console.log('Allways')
    })
}

test()
// Reject :  pass Error msg!
// Allways
// A

===========================================================================
위의 test 를 async 를 사용해서 해보자. try, catch 문 사용
async function test() {
  try {
    const res = await a(2)
    console.log(res)
  } catch(error) {
    console.log(error)
  } finally {
    console.log('Allways!')
  }  
}