JS - Promise APIs


all()

Promise.all(iterable Object)

νŒŒλΌλ―Έν„°μ˜ λͺ¨λ“  Promise 처리λ₯Ό μ™„λ£Œν–ˆμ„ λ•Œ then 의 ν•Έλ“€λŸ¬ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€. νŒŒλΌλ―Έν„°μ— μž‘μ„±λœ μˆœμ„œλŒ€λ‘œ Promise 의 μΈμŠ€ν„΄μŠ€λŠ” μƒμ„±λ˜κ³  μ‹€ν–‰λ˜λŠ” μˆœμ„œλŠ” 각 μš”μ²­μ— 따라 λ‹€λ₯Ό 수 μžˆλ‹€.
λͺ¨λ“  μš”μ²­μ΄ μ’…λ£Œλ˜μ—ˆμœΌλ©΄ then() 이 μ‹€ν–‰λ˜λ©΄μ„œ 각 νŒŒλΌλ―Έν„°μ˜ resolve 값을 νŒŒλΌλ―Έν„°μ— μž‘μ„±λœ μˆœμ„œλ‘œ μ„€μ •ν•œλ‹€.

const promiseDelay = (delay) => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(delay);
      resolve(delay);
    }, delay)
  })
}

Promise.all([
          promiseDelay(700),
          promiseDelay(300), 
          promiseDelay(500)
        ]).then(param => console.log(param));

// 300
// 500
// 700
// [700, 300, 500]        

μ‹€ν–‰ 도쀑 reject κ°€ λ°œμƒν•˜κ²Œ 되면 λͺ¨λ“  μš”μ²­μ΄ λλ‚˜κΈ°λ₯Ό 기닀리지 μ•Šκ³  reject κ°€ λ°œμƒν•œ μ‹œμ μ— rejected μƒνƒœμ— λŒ€ν•œ ν•Έλ“€λŸ¬ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ²Œ 되며 fulfilled μƒνƒœμ— λŒ€ν•œ ν•Έλ“€λŸ¬ ν•¨μˆ˜λŠ” 호좜 λ˜μ§€ μ•ŠλŠ”λ‹€.
νŒŒλΌλ―Έν„°μ— λ“±λ‘λœ ν•¨μˆ˜λŠ” λͺ¨λ‘ μ‹€ν–‰λ˜κΈ°λŠ” ν•œλ‹€. 쀑간에 μ’…λ£Œλ˜κ±°λ‚˜ ν•˜μ§€ μ•ŠλŠ”λ‹€.

const promiseDelay = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(delay);
      delay === 300 ? reject(delay) : resolve(delay);
    }, delay)
  })
}

Promise.all([
          promiseDelay(700),
          promiseDelay(300), 
          promiseDelay(500)
        ])
        .then(param => console.log(param))
        .catch(error => console.log(`Rejected: ${error}`));

// 300
// Rejected: 300
// 500
// 700        

race()

Promise.race(iterable Object)

reject, resolve 와 관계 없이 처음 ν•œλ²ˆλ§Œ μ‹€ν–‰ν•˜κ³  더 이상 μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
첫 응닡이 reject 라면 rejected μƒνƒœμ˜ ν•Έλ“€λŸ¬ ν•¨μˆ˜κ°€ 호좜되고 더이상 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

const promiseDelay = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(delay);
      delay === 300 ? reject(delay) : resolve(delay);
    }, delay)
  })
}

Promise.race([
          promiseDelay(700),
          promiseDelay(300), 
          promiseDelay(500)
        ])
        .then(param => console.log(`First resolved: ${param}`))
        .catch(error => console.log(`Rejected: ${error}`));

// 300
// First resolved: 300
// 500
// 700        

allSettled()

μœ„μ—μ„œ all 의 κ²½μš°λŠ” ν•œ μš”μ²­μ΄λΌλ„ μ‹€νŒ¨ν•˜λ©΄ ν•Έλ“€λŸ¬λ₯Ό ν˜ΈμΆœν•˜κ³  더 이상 then 을 호좜 ν•˜μ§€ μ•ŠλŠ”λ‹€.
이점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄μ„œμΈμ§€ allSettled λŠ” λͺ¨λ“  μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό 확인 ν•  수 μžˆλŠ” API 이닀.
rejected μƒνƒœκ°€ λ°œμƒν•œλ‹€κ³  ν•˜μ—¬λ„ catch λ“±μ˜ rejected ν•Έλ“€λŸ¬ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

μ§€μ›ν•˜λŠ” λΈŒλΌμš°μ € ν™•μΈν•„μš”

const promiseDelay = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(delay);
      delay === 300 ? reject(delay) : resolve(delay);
    }, delay)
  })
}

Promise.allSettled([
          promiseDelay(700),
          promiseDelay(300), 
          promiseDelay(500)
        ])
        .then(results => {
          results.forEach(result => console.log(result));
        })
        .catch(errors => {
          errors.forEach(error => console.log(error));
        });

// 300
// 500
// 700
// {status: "fulfilled", value: 700}
// {status: "rejected", reason: 300}
// {status: "fulfilled", value: 500}

any()

race λŠ” fullfiled, rejected 상관 없이 κ°€μž₯ λ¨Όμ € pending이 μ’…λ£Œλœ μš”μ²­μ— 따라 λ™μž‘ν–ˆλ‹€λ©΄ any λŠ” fullfilled μƒνƒœκ°€ κ°€μž₯ λ¨Όμ €λœ μš”μ²­μœΌλ‘œ μ§„ν–‰λ˜λŠ” API 이닀.
fullfilled μƒνƒœκ°€ 된 μš”μ²­μ„ μ²˜λ¦¬ν•˜λ―€λ‘œ rejected ν•Έλ“€λŸ¬ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

μ§€μ›ν•˜λŠ” λΈŒλΌμš°μ € ν™•μΈν•„μš”

const promiseDelay = (delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(delay);
      delay === 300 ? reject(delay) : resolve(delay);
    }, delay)
  })
}

Promise.any([
          promiseDelay(700),
          promiseDelay(300), 
          promiseDelay(500)
        ])
        .then(value => console.log(`Any: ${value}`))
        .catch(error => console.log(error));

// 300
// 500
// Any: 500
// 700        

Tags:

Categories:

Updated: