๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[10์ฃผ์ฐจ ์Šคํ„ฐ๋””]45์žฅ-ํ”„๋กœ๋ฏธ์Šค

by HomieKim 2022. 4. 2.

ํ”„๋กœ๋ฏธ์Šค

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋‹จ์ 

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ๊ณ  ํ•จ
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ? -> ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์— ์™„๋ฃŒ๋จ
  • ์ฆ‰, ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘๋˜์ง€ ์•Š์Œ
// GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = url => {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url);
  xhr.send();

  xhr.onload = () => {
    if (xhr.status === 200) {
      // โ‘  ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      return JSON.parse(xhr.response);
    }
    console.error(`${xhr.status} ${xhr.statusText}`);
  };
};

// โ‘ก id๊ฐ€ 1์ธ post๋ฅผ ์ทจ๋“
const response = get('https://jsonplaceholder.typicode.com/posts/1');
console.log(response); // undefined
  • onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํƒœ์Šคํฌ ํ์— ์ €์žฅ๋˜์–ด ๋Œ€๊ธฐํ•˜๋‹ค, ์ฝœ ์Šคํƒ์ด ๋น„๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œ ๋˜์–ด ์‹คํ–‰ ๋˜๊ธฐ ๋•Œ๋ฌธ
  • ์ •๋ฆฌ : ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€์— ๋ฐ˜ํ™˜ ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ (์ฝœ๋ฐฑ ํ—ฌ ๋ฐœ์ƒ)
  • ์ฝœ๋ฐฑ ํ—ฌ์˜ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์„ ๋ฌผ๋ก  ์—๋Ÿฌ์ฒ˜๋ฆฌ๋„ ๊ณค๋ž€ํ•ด์ง, ์ด๋ฅผ ๊ทน๋ณต ํ•˜๊ธฐ ์œ„ํ•ด ES6 ๋ถ€ํ„ฐ ํ”„๋กœ๋ฏธ์Šค(Promise)๊ฐ€ ๋„์ž… ๋จ

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒ์„ฑ

  • Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ ํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๊ณ , ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve ์™€ reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
const promise = new Promise((resolve, reject)=>{
    // Promise ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
    if(/* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต */){
        resolve('result');
    } else {
        reject('failure reason');
    }
});
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต ์‹œ resolveํ•จ์ˆ˜ ํ˜ธ์ถœ, ์‹คํŒจ์‹œ reject ํ•จ์ˆ˜ ํ˜ธ์ถœ
// GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const promiseGet = url => {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.send();

    xhr.onload = () => {
      if (xhr.status === 200) {
        // ์„ฑ๊ณต์ ์œผ๋กœ ์‘๋‹ต์„ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
        resolve(JSON.parse(xhr.response));
      } else {
        // ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
        reject(new Error(xhr.status));
      }
    };
  });
};

// promiseGet ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
promiseGet('https://jsonplaceholder.typicode.com/posts/1');
  • resolve ํ•จ์ˆ˜์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด reject ํ•จ์ˆ˜์— ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌ
  • Promise๋Š” ํ˜„์žฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ ๋˜๊ณ  ์žˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ฐ€์ง
ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ ์ •๋ณด ์˜๋ฏธ ์ƒํƒœ ๋ณ€๊ฒฝ ์กฐ๊ฑด
pending ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์•„์ง ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„ ๊ธฐ๋ณธ ์ƒํƒœ
fulfilled ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์„ฑ๊ณต) resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ
rejected ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์‹คํŒจ) reject ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • ์ƒ์„ฑ๋œ ์งํ›„์˜ ํ”„๋กœ๋ฏธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ pending ์ƒํƒœ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋จ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต : resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•ด fulfilled ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹คํŒจ : reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•ด rejected ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    fulfilled ๋˜๋Š” rejected ์ƒํƒœ๋ฅผ settled ์ƒํƒœ๋ผ๊ณ  ๋ถ€๋ฆ„

์ •๋ฆฌ : ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด

ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

  • ํ”„๋กœ๋ฏธ์Šค์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™” ํ•˜๋ฉด ์ด์— ๋”ฐ๋ฅธ ํ›„์† ์ฒ˜๋ฆฌ ํ•„์š”
  • ํ”„๋กœ๋ฏธ์Šค๋Š” ํ›„์† ๋ฉ”์„œ๋“œ then, catch, finally ์ œ๊ณต

Promise.prototype.then

  • then ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ์€ fulfilled ์ƒํƒœ ๋˜๋ฉด(resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ๋œ ์ƒํƒœ) ํ˜ธ์ถœ, ์ด๋•Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Œ
  • ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ์€ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ˜ธ์ถœ, ์ด๋•Œ ์—๋Ÿฌ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Œ
  • then ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜
  • ๋งŒ์•ฝ then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ ํ”„๋กœ๋ฏธ์Šค ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ resolve ๋˜๋Š” reject ํ•˜์—ฌ ๋ฐ˜ํ™˜

Promise.prototype.catch

  • catch ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Œ
  • catch ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” rejected์ผ ๋•Œ๋งŒ ํ˜ธ์ถœ ๋จ
  • ๋™์ž‘ ๋ฐฉ์‹์€ then ๊ณผ ๋™์ผ

Promise.prototype.finally

  • ํ”„๋กœ๋ฏธ์Šค์˜ ์„ฑ๊ณต, ์‹คํŒจ์™€ ์ƒ๊ด€ ์—†์ด ๋ฌด์กฐ๊ฑด ํ•œ ๋ฒˆ ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜

ํ”„๋กœ๋ฏธ์Šค์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  • then์˜ ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • catch ๋ฉ”์„œ๋“œ ํ™œ์šฉ ํ•ด์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • catch ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ then(undefined, onRejected) ํ˜ธ์ถœthen์˜ ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ๋‘๋ฒˆ์งธ ์ฝœ๋ฐฑ์—์„œ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€๋Šฅ
    ๋”ฐ๋ผ์„œ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋Š” catch๋กœ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
promiseGet(url)
    .then(res => consoloe.log(res))
    .then(undefined, err => console.error(err));

// ์œ„ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜
promiseGet(url)
    .then(res => consoloe.log(res))
    .catch(err => console.error(err));

ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

  • ํ”„๋กœ๋ฏธ์Šค ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ์ด๋ฅผ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹ ์ด๋ผ ํ•œ๋‹ค.
const url = 'https://jsonplaceholder.typicode.com';

// id๊ฐ€ 1์ธ post์˜ userId๋ฅผ ์ทจ๋“
promiseGet(`${url}/posts/1`)
  // ์ทจ๋“ํ•œ post์˜ userId๋กœ user ์ •๋ณด๋ฅผ ์ทจ๋“
  .then(({ userId }) => promiseGet(`${url}/users/${userId}`))
  .then(userInfo => console.log(userInfo))
  .catch(err => console.error(err));

ํ”„๋กœ๋ฏธ์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ

Promise.all

  • Promise.all ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ƒ๊ด€ ์—†๋Š” ๊ฒฝ์šฐ Promise.all ๋ฉ”์„œ๋“œ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.
  • Promise.all ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ชจ๋‘ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.
  • Promise.all ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์š”์†Œ๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ Promise.resolve๋กœ ๋ž˜ํ•‘
const request1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const request2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const request3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));

Promise.all([request1(), request2(), request3()])
  .then(console.log)  // [1,2,3]
  .catch(console.err);
  • ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ๋ชจ๋‘ fulfilled ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ๊ทธ ๋ฐฐ์—ด์„ resolve ํ•ด์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜
  • ์ฆ‰, ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ ๋จ

Promise.race

  • Promise.all ๋ฉ”์„œ๋“œ์™€ ๋™์ผ ํ•˜๊ฒŒ ๋™์ž‘ ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋จผ์ € fulfilled ๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

Promise.allSettled

  • Promise.allSettled ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์Œ.
  • ์ „๋‹ฌ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ชจ๋‘ settled ์ƒํƒœ(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ)๊ฐ€ ๋˜๋ฉด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜.
Promise.allSettled([
  new Promise(resolve => setTimeout(() => resolve(1), 2000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 1000))
]).then(console.log);
/*
[
  {status: "fulfilled", value: 1},
  {status: "rejected", reason: Error: Error! at <anonymous>:3:54}
]
*/
  • Promise.all๊ณผ ๋‹ฌ๋ฆฌ fulfilled, rejected ์ƒํƒœ์™€ ์ƒ๊ด€ ์—†์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๋“ค์˜ ๊ฒฐ๊ด๊ฐ’์ด ๋ชจ๋‘ ๋‹ด๊ฒจ ์žˆ์Œ
  • Promise.allSettled์˜ ๊ฒฐ๊ณผ ๊ฐ์ฒด
    • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled์ธ ๊ฒฝ์šฐ: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” status ํ”„๋กœํผํ‹ฐ์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” value ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง.
    • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejected์ธ ๊ฒฝ์šฐ: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” status ํ”„๋กœํผํ‹ฐ์™€ ์—๋Ÿฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” reason ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง.

๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํƒœ์Šคํฌ ํ์— ์ผ์‹œ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํƒœ์Šคํฌ ํ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ์—์„œ ์ €์žฅ
  • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ๋Š” ํƒœ์Šคํฌ ํ์™€ ๋™์ผํ•œ ์›๋ฆฌ๋กœ ๋™์ž‘ ํ•˜์ง€๋งŒ, ํƒœ์Šคํฌ ํ ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

fetch

  • fetch ํ•จ์ˆ˜๋Š” XMLHttpRequest ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTTP ์š”์ฒญ ์ „์†ก ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Web API์ด๋‹ค.
  • ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•˜๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋‹จ์ ์„ ๋ณด์™„ ๊ฐ€๋Šฅ
const promise = fetch(url [, options])
  • fetch ํ•จ์ˆ˜๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” Response ๊ฐ์ฒด๋ฅผ ๋ž˜ํ•‘ํ•œ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ์ฆ‰, ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„์† ์ฒ˜๋ฆฌ๋ฉ”์„œ๋“œ (then, catch) ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • then์„ ํ†ตํ•ด resolveํ•œ Response ๊ฐ์ฒด๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณต์˜ˆ๋ฅผ ๋“ค์–ด Response.prototype.json ๋ฉ”์„œ๋“œ๋Š” HTTP ์‘๋‹ต ๋ชธ์ฒด๋ฅผ ์ทจ๋“ํ™” ํ•˜์—ฌ ์—ญ์ง๋ ฌํ™” ํ•œ๋‹ค.

๋Œ“๊ธ€