8월 31일(화) Promise

남이섬·2021년 8월 31일
0
post-custom-banner

new Promise()

resolve() // go to next Action
reject() // handke Error

callback

const print = (string, callback) => {
  setTimeout(
    () => {
      console.log(string)
      callback()
    },
    Math.floor(Math.random() * 100) + 1
  )
}
const printAll = () => {
  print("A", () => {
    print("B", () => {
      print("C", () => { })
    })
  })
}
PrintAll()

print callback함수를 Promise 형태로 변경

const print = (string) => {
  return new Promise((resolve, reject) => {
    setTimeout(
      () => {
        console.log(string)
        resolve()
      },
      Math.floor(Math.random() * 100) + 1
    )
  })
}
const printAll = () => {
  print("A")
    .then(() => {
      return print("B")
    })
    .then(() => {
      return print("C")
    })
}
printAll()

Promise


Promise Hell

function goTo() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to there') }, 100)
  })
}
function sitAndCode() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. sit and code') }, 100)
  })
}
function eat() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('3. eat anything') }, 100)
  })
}
function goToBad() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to bad') }, 100)
  })
}
goTo()
  .then(data => {
    console.log(data)
    sitAndCode()
      .then(data => {
        console.log(data)
        eat()
          .then(data => {
            console.log(data)
            goToBad()
              .then(data => {
                console.log(data)
              })
          })
      })
  })

promise hell에 빠지지않게 하기위해서 return처리가 중요하다


promise Chaining

function goTo() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to there') }, 100)
  })
}
function sitAndCode() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. sit and code') }, 100)
  })
}
function eat() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('3. eat anything') }, 100)
  })
}
function goToBad() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to bad') }, 100)
  })
}
goTo()
  .then(data => {
    console.log(data)
    return sitAndCode()
  })
sitAndCode()
  .then(data => {
    console.log(data)
    return eat()
  })
eat()
  .then(data => {
    console.log(data)
    return goToBad()
  })
goToBad()
  .then(data => {
    console.log(data)
  })

return을 통하여 해당 비동기를 다시 다음으로 넘기고,
다시 .then으로 받아옴으로서 promise hell을 방지한다


async await

function goTo() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to there') }, 500)
  })
}
function sitAndCode() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. sit and code') }, 400)
  })
}
function eat() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('3. eat anything') }, 300)
  })
}
function goToBad() {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve('1. go to bad') }, 200)
  })
}
const result = async () => {
//
  const one = await goTo();
  console.log(one)
  //
  const two = await sitAndCode()
  console.log(two)
  //
  const three = await eat()
  console.log(three)
  //
  const four = await goToBad()
  console.log(four)
}
result()

await 비동기 함수들을 마치 동기적인 함수처럼 쓸 수가 있다
일반함수 처럼 순차적으로 실행한다

함수로 표현된 것 처럼 시간순으로 보면 goToBad함수가 먼저 실행 되어야 할꺼 같지만 순차적으로 실행되어 맨나중에 찍히게 된다

실행되는 건 promise와 같지만 표현자체를 동기적으로 쓸 수 있어서 코드 가독성이 좋다


마무리
1. 자바스크립트가 왜 비동기적으로 돌아가야 하는지
2. 비동기적으로 돌아가는 자바스크립트를 callback을 활용하여 제어
3. callback의 까다로운 부분을 promise를 사용하여 좀 더 쉽고 편하게 비동기함수를 처리할 수있다
4. promise 역시 promise hell에 빠질 수 있기 때문에 promise chaining을 적절히 사용하여 방지한다
5. async await 기능으로 promise를 일반 함수 처럼 사용할 수 있다

github TIL(Promise, async await 정리)

profile
즐겁게 살자
post-custom-banner

0개의 댓글