๋น„๋™๊ธฐ(Asynchronous)๐Ÿ’ก

๐Ÿงก๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

  • ๋™๊ธฐ (Synchronous)
    • ์ฝ”๋“œ์˜ ์ž‘์„ฑ์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ
    • ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ๋‚˜ํƒ€๋‚จ
  //๋™๊ธฐ์ฝ”๋“œ ์˜ˆ์‹œ 
  //์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋จ
  console.log(1)
  console.log(2)
  console.log(3)

  // ์ถœ๋ ฅ
  // 1
  // 2
  // 3
  • ๋น„๋™๊ธฐ (Asynchronous)
    - ์ฝ”๋“œ์˜ ์ž‘์„ฑ์ˆœ์„œ๊ฐ€ ๋ฌด์‹œ๋จ
    - ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
  // ๋น„๋™๊ธฐ ์ฝ”๋“œ ์˜ˆ์‹œ 1
  // ์ฝ”๋“œ์ž‘์„ฑ ์ˆœ์„œ์™€ ์‹คํ–‰์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ

  console.log(1)
  setTimeout(() => { console.log(2) }, 1000)
  console.log(3)

  // ์ถœ๋ ฅ
  // 1
  // 3
  // 2
  // ๋น„๋™๊ธฐ ์ฝ”๋“œ ์˜ˆ์‹œ 2
  // ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
  const btn = document.querySelector('button')

  btn.addEventListener('click',function(){
      console.log('Button Clicked')
  })

  console.log('Hello')

  // ์ถœ๋ ฅ 
  // 'Hello'
  // 'Button Clicked' (๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ์‹คํ–‰ ๋จ)

๐ŸงกPromise

  • ๋น„๋™๊ธฐ์ฝ”๋“œ ์ฒ˜๋ฆฌ ์‹œ ์‚ฌ์šฉ ๋จ

  • ๋™๊ธฐ์ฝ”๋“œ์ฒ˜๋Ÿผ ์š”์ฒญ๊ณผ ๋™์‹œ์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋‚˜ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ๋‹ค๋Š” '์•ฝ์†'(ํ”„๋กœ๋ฏธ์Šค)์„ ๋ฐ˜ํ™˜

  • Promise์˜ ์ƒํƒœ

    • ๋Œ€๊ธฐ(pending) : ์ดˆ๊ธฐ(๊ธฐ๋ณธ) ์ƒํƒœ
    • ์ดํ–‰(fulfilled) : ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ ๋จ => resolve()
    • ๊ฑฐ๋ถ€(reject) : ์—ฐ์‚ฐ์ด ์‹คํŒจ / ๊ฑฐ๋ถ€ ๋จ => reject()
  • Promise์˜ ์ธ์ˆ˜๋กœ resolve์™€ reject๊ฐ€ ์ œ๊ณต ๋จ

  • ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ resolve(...)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์‹คํŒจํ•œ ๊ฒฝ์šฐ reject(...)๋ฅผ ํ˜ธ์ถœ

new Promise((resolve, reject) => {
  if(...) {
     // ๊ฑฐ๋ถ€ / ์‹คํŒจ ์‹œ
     reject('์—๋Ÿฌ๋ฉ”์„ธ์ง€')
  }
  
  // ์„ฑ๊ณต ์‹œ
  resolve('๋ฐ˜ํ™˜ ๋  ๊ฒฐ๊ณผ๊ฐ’')
})

๐Ÿ’›Promise ์˜ˆ์‹œ์ฝ”๋“œ

  function loadImage(src){
    // ํ•จ์ˆ˜ ๋‚ด ์‚ฌ์šฉ ์‹œ Promise์•ž returnํ‚ค์›Œ๋“œ ํ•„์ˆ˜
    return new Promise((resolve, reject) => {
      
     if (!/^https?:\/\//.test(src)) {
       
      reject(new Error('์ด๋ฏธ์ง€ ์ฃผ์†Œ์˜ ํ”„๋กœํ† ์ฝœ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!'))
       
      //reject์‹œ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋”์ด์ƒ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋„๋ก return
      return
     }

     const img = document.createElement('img')
     img.src = src
      
     img.addEventListener('load', () => {
       //๋กœ์ง ์ข…๋ฃŒ(์—ฐ์‚ฐ์„ฑ๊ณต)
       resolve()
     })
      
    })
  }

๐Ÿงกtry & catch

  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ตฌ๋ฌธ
  • ์—๋Ÿฌ ๋ฐœ์ƒํ™•๋ฅ ์ด ์žˆ๋Š” ์—ฐ์‚ฐ ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ ๋จ
  • ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์•„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Œ โ—
  try {
    //๊ธฐ๋ณธ ๋กœ์ง ์ž‘์„ฑ
  } catch () {
    //try๋ธ”๋Ÿญ ๋‚ด์˜ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ์—๋Ÿฌ(์˜ˆ์™ธ)๋ฐœ์ƒ ์‹œ ์‹คํ–‰ ๋  ๋กœ์ง
  }
  • try : ๊ธฐ๋ณธ ์—ฐ์‚ฐ ์‹คํ–‰
  • catch : try๋ธ”๋Ÿญ์˜ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ ์ค‘ ๋ฐœ์ƒํ•ญ ์˜ˆ์™ธ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋กœ์ง

๐Ÿ’›try&catch ์˜ˆ์‹œ์ฝ”๋“œ

  //์œ„ promise์˜ˆ์‹œ์ฝ”๋“œ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ƒํ™ฉ
  try {
    await loadImage('picsum.photos/3000')
    console.log('์ด๋ฏธ์ง€ ๋กœ๋“œ๋จ!!')
  } catch (error) {
    console.log(error.message)
  }
profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์ผ๊ธฐ ๐Ÿ’ญ

0๊ฐœ์˜ ๋Œ“๊ธ€