Promise

Yu Sang MinΒ·2025λ…„ 2μ›” 28일
0

JavaScript

λͺ©λ‘ 보기
45/48
post-thumbnail

πŸ“Œ Promise

πŸ’‘ν”„λ‘œλ―ΈμŠ€λŠ” μš”μ²­μ„ ν•˜κ³  일단 λ‹€λ₯Έ μž‘μ—…μ„ ν•˜λ©° μ™„λ£Œλ˜λ©΄ μ•Œλ €λ‹¬λΌκ³  ν•˜λŠ”κ²ƒκ³Ό κ°™λ‹€.
Ex).
1. μ†ŒλΉ„μžκ°€ κ°€κ²Œμ— μƒν’ˆ ꡬ맀λ₯Ό μš”μ²­
2. μ€€λΉ„λ˜λ©΄ 연락달라고 ν•˜κ³  λ‹€λ₯Έ 일을 처리
3. νŒλ§€μžκ°€ μƒν’ˆμ΄ μ€€λΉ„λ˜μ–΄ 연락 함

  • ν”„λ‘œλ―ΈμŠ€λŠ” new Promise ν‚€μ›Œλ“œλ‘œ μƒμ„±ν•œλ‹€.
  • ν•¨μˆ˜ 2개λ₯Ό 전달 λ°›λŠ”λ° resolve, reject 이닀.
  • resolveλŠ” μ„±κ³΅ν•œ 경우, rejectλŠ” μ‹€νŒ¨ν•œ 경우 μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μ΄λ‹€.
  • 어떀일이 μ™„λ£Œλ˜κ³  λ‚œ 뒀에 μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • new Promise μƒμ„±μžκ°€ λ°˜ν™˜ν•˜λŠ” promise κ°μ²΄λŠ” state와 resultλ₯Ό ν”„λ‘œνΌν‹°λ‘œ κ°–λŠ”λ‹€.
// promise 객체
{
    state: β€˜pending’,  // λŒ€κΈ°
    result: undefined
}
  • stateλŠ” μ΅œμ΄ˆμ— pending(λŒ€κΈ°)μ΄μ—ˆλ‹€κ°€ resolveκ°€ 호좜되면(μ„±κ³΅ν•˜λ©΄), fulfilled(이행됨)κ°€ λœλ‹€.
// resolve 호좜 ν›„
{
    state: β€˜fulfilled’,  // 이행됨
    result: value
}
  • μ΄λ•Œ resultλŠ” resolve ν•¨μˆ˜λ‘œ μ „λ‹¬λœ κ°’
  • λ§Œμ•½ rejectκ°€ 호좜되면(μ‹€νŒ¨ν•˜λ©΄) stateλŠ” rejected(거뢀됨)이 λœλ‹€.
  • μ΄λ•Œ resultλŠ” reject ν•¨μˆ˜λ‘œ μ „λ‹¬λœ error이닀.
const pr = new Promise ((res, rej) => {
    setTimeout(() => {
        resolve(β€œOK”);
    }, 3000);
});
  • ν”„λ‘œλ―ΈμŠ€κ°€ λ°˜ν™˜ν•˜λŠ” promise 객체의 state ν”„λ‘œνΌν‹°λŠ” 3초 이전엔 pending(λŒ€κΈ°) μ˜€λ‹€κ°€ 3초 μ΄ν›„μ—λŠ” fulfilled(이행됨)이 λ˜λ©΄μ„œ resultλŠ” undefined μ˜€λ‹€κ°€ resolve의 값인 β€œOK”가 λœλ‹€.
const pr = new Promise ((res, rej) => {
    setTimeout(() => {
        rej(new Error(β€œβ€¦error”));
    }, 3000);
});

πŸ”” μœ„ μ½”λ“œλŠ” 판맀자 μ½”λ“œμ˜ μ˜ˆμ‹œμ΄κ³ , μ†ŒλΉ„μž μž…μž₯의 μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž

const pr = new Promise((res, rej) => {
    setTimeout(() => {
         res(β€œOK”);
    }, 3000);
});

pr.then(
    function(result){
       console.log(result + β€œκ°€μ§€λŸ¬ κ°€μžβ€¦β€)
    },     // μ΄ν–‰λ˜μ—ˆμ„λ•Œ μ‹€ν–‰
    function(err){
       console.log(β€œλ‹€μ‹œ μ‹€ν–‰ν•΄μ£Όμ„Έμš”β€¦β€)
    }      // κ±°λΆ€λ˜μ—ˆμ„λ•Œ μ‹€ν–‰
);
  • then을 μ‚¬μš©ν•˜μ—¬ μ½œλ°±ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.
  • then은 ν”„λ‘œλ―ΈμŠ€κ°€ λ°˜ν™˜ν•˜λŠ” resultλ₯Ό 인자둜 λ°›μ•„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • then이외 μ‚¬μš© κ°€λŠ₯ν•œ 것이 catch와 finally
  • catchλŠ” errorκ°€ λ°œμƒν•œ 경우, 즉 reject인 κ²½μš°μ—λ§Œ μ‹€ν–‰
// μœ„ μ˜ˆμ‹œμ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 λ°”κΏ€ 수 μžˆλ‹€.
const pr = new Promise((res, rej) => {
    setTimeout(() => {
        res(β€œOK”);
    }, 3000);
});

pr.then(
    function(result) {
        console.log(result + β€œκ°€μ§€λŸ¬ κ°€μžβ€¦β€)
    }
).catch(
    function(err) {
        console.err(err + β€œ: λ‹€μ‹œ μ‹€ν–‰ν•΄ μ£Όμ„Έμš”β€¦β€);
    }
)
  • μœ„ μœ„ μ½”λ“œ μ˜ˆμ‹œμ—μ„œ thenμ—μ„œ 두 번째둜 μ „λ‹¬ν–ˆλ˜ ν•¨μˆ˜λ₯Ό catch μ•ˆμœΌλ‘œ λ„£μ–΄μ€€λ‹€.
  • 가독성 μΈ‘λ©΄μ—μ„œλ„ μ’‹κ³  첫 번째 ν•¨μˆ˜μ—μ„œμ˜ μ—λŸ¬λ„ μž‘μ•„μ£ΌκΈ° λ•Œλ¬Έμ— catch문을 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯.
  • finallyλŠ” 이행이든 κ±°λΆ€λ“  μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ 항상 싀행됨.
  • λ‘œλ”© 화면을 μ—†μ„λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•œλ‹€.
pr.then(
    function(result) {
        console.log(result + β€œμ£Όλ¬Έμ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€β€¦β€)
    }
).catch(
   function(err) {
        console.err(err + β€œλ‹€μ‹œ μ‹€ν–‰ν•΄ μ£Όμ„Έμš”β€¦.”)
   }
).finally(
   function() {
        console.log(β€œμ£Όλ¬Έ 끝”)
   }
)
profile
ν’€μŠ€νƒ 개발자 지망생 (React, Node.js, AWS, Git, Github, Github Action, Docker)

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보