Promise

new Promise

  • PromiseλŠ” class이기에 new ν‚€μ›Œλ“œλ₯Ό 톡해 Promise 객체λ₯Ό 생성

  • PromiseλŠ” 비동기 처리λ₯Ό μˆ˜ν–‰ν•  μ½œλ°±ν•¨μˆ˜λ₯Ό 인수둜 λ°›λŠ”λ°, 이 μ½œλ°±ν•¨μˆ˜λŠ” resolve, reject ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬λ°›μŒ

  • Promise 객체가 μƒμ„±λ˜λ©΄ μ½œλ°±ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ 싀행됨

  • μ½”λ“œκ°€ 잘 μ²˜λ¦¬λ˜μ—ˆλ‹€λ©΄ resolveν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , μ—λŸ¬ λ°œμƒ μ‹œ rejectν•¨μˆ˜λ₯Ό 호좜

    let promise = new Promise((resove, reject) => {
        // 1. μ •μƒμ μœΌλ‘œ μ²˜λ¦¬λ˜λŠ” 경우 resolve의 μΈμžμ— κ°’ 전달
        resolve(value);
    
        // 2. μ—λŸ¬ λ°œμƒμ‹œ reject의 μΈμžμ— μ—λŸ¬λ©”μ‹œμ§€ 전달
        reject(value);
    })

Promise 객체의 λ‚΄λΆ€ ν”„λ‘œνΌν‹°

  • new Promiseκ°€ λ°˜ν™˜ν•˜λŠ” Promise κ°μ²΄λŠ” state, result λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό 가짐

  • λ‹€λ§Œ, 직접 μ ‘κ·Όν•  수 μ—†κ³  .then, .catch, .finally λ©”μ†Œλ“œ μ‚¬μš©ν•΄ μ ‘κ·Ό κ°€λŠ₯

  • State

    • κΈ°λ³Έ μƒνƒœλŠ” pending. 비동기 처리λ₯Ό μˆ˜ν–‰ν•  μ½œλ°±ν•¨μˆ˜κ°€ 잘 μž‘λ™ν–ˆλ‹€λ©΄ β†’ fulfilled둜 λ³€κ²½, μ—λŸ¬ λ°œμƒ μ‹œ rejected

  • Result

    • κΈ°λ³Έ μƒνƒœλŠ” undefined 비동기 처리λ₯Ό μˆ˜ν–‰ν•  μ½œλ°±ν•¨μˆ˜κ°€ 잘 μž‘λ™ν•˜μ—¬ resolve(value) 호좜되면 β†’ value둜, μ—λŸ¬ λ°œμƒν•΄ reject(error) 호좜되면 β†’ error 둜 λ³€κ²½

then, catch, finally

then

  • μ½œλ°±ν•¨μˆ˜μ— μž‘μ„±ν–ˆλ˜ μ½”λ“œλ“€μ΄ 잘 μ²˜λ¦¬λ˜μ—ˆλ‹€λ©΄ resolve ν•¨μˆ˜ 호좜 β†’ .then λ©”μ†Œλ“œλ‘œ μ ‘κ·Ό κ°€λŠ₯

  • .then μ•ˆμ—μ„œ λ¦¬ν„΄ν•œ 값이 Promise라면 Promise λ‚΄λΆ€ ν”„λ‘œνΌν‹° resultλ₯Ό λ‹€μŒ .then의 μ½œλ°±ν•¨μˆ˜μ˜ 인자둜 λ°›μ•„μ˜΄

  • Promiseκ°€ μ•„λ‹ˆλΌλ©΄ λ¦¬ν„΄ν•œ 값을 .then의 μ½œλ°±ν•¨μˆ˜ 인자둜 λ°›μ•„μ˜¬ 수 있음

    let promise = new Promise((resolve, reject) => {
        resolve("성곡");
    });
    
    promise.then(value => {
        console.log(value); // "성곡"
    })

Catch

  • μ½œλ°±ν•¨μˆ˜μ— μž‘μ„±ν•œ μ½”λ“œμ˜ μ—λŸ¬ λ°œμƒ μ‹œ rejectν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  .catch λ©”μ†Œλ“œλ‘œ μ ‘κ·Ό κ°€λŠ₯

    let promise = new Promise(function(resolve, reject) {
    reject(new Error("μ—λŸ¬"))
    });
    
    promise.catch(error => {
    console.log(error); // Error: μ—λŸ¬
    })

Finally

  • μ½œλ°±ν•¨μˆ˜μ— μž‘μ„±ν•œ μ½”λ“œλ“€μ΄ 정상 처리 여뢀와 관계 없이 .finally λ©”μ†Œλ“œλ‘œ μ ‘κ·Ό κ°€λŠ₯

    let promise = new Promise(function(resolve, reject) {
      resolve("성곡");
    });
    
    promise
    .then(value => {
      console.log(value); // "성곡"
    })
    .catch(error => {
      console.log(error);
    })
    .finally(() => {
      console.log("성곡이든 μ‹€νŒ¨λ“  μž‘λ™"); // "성곡이든 μ‹€νŒ¨λ“  μž‘λ™"
    })

Promise Chaining

  • 비동기 μž‘μ—…μ„ 순차적으둜 μ§„ν–‰ν•΄μ•Ό ν•˜λŠ” 경우

  • Promise all()

  • μ—¬λŸ¬ 개의 비동기 μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ μ‚¬μš©

  • μΈμžλ‘œλŠ” 배열을 λ°›μœΌλ©°, ν•΄λ‹Ή 배열에 μžˆλŠ” λͺ¨λ“  Promiseμ—μ„œ μ½œλ°±ν•¨μˆ˜ λ‚΄ μž‘μ„±ν–ˆλ˜ μ½”λ“œλ“€μ΄ μ •μƒμ μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆλ‹€λ©΄ κ²°κ³Όλ₯Ό 배열에 μ €μž₯ν•΄ μƒˆλ‘œμš΄ Promiseλ₯Ό λ°˜ν™˜

  • λ”λΆˆμ–΄, 인자둜 받은 λ°°μ—΄μ˜ Promise 쀑 ν•˜λ‚˜λΌλ„ μ—λŸ¬ λ°œμƒ μ‹œ, λ‚˜λ¨Έμ§€ Promise state와 상관없이 μ¦‰μ‹œ μ’…λ£Œ

    Promise.all([promiseOne(), promiseTwo(), promiseThree()])
        .then((value) => console.log(value)) // ['1초', '2초', '3초']
        .catch((err) => console.log(err));

Last updated