Skip to content

Latest commit

ย 

History

History
255 lines (189 loc) ยท 12.5 KB

promise.md

File metadata and controls

255 lines (189 loc) ยท 12.5 KB

๐Ÿ’ป Promise


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Promise๋ž€?

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

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋‹จ์ 

๐Ÿƒ ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ๋ชจ๋ธ(Synchronous processing model)๊ณผ ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Asynchronous processing model)

  • ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์€ ์ง๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํƒœ์Šคํฌ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์–ด๋–ค ์ž‘์—…์ด ์ˆ˜ํ–‰์ค‘์ด๋ฉด ๋‹ค์Œ ํƒœ์Šคํฌ๋Š” ๋Œ€๊ธฐํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•˜๋”๋ผ๋„ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋Œ€๋ถ€๋ถ„์˜ DOM ์ด๋ฒคํŠธ์™€ Timer ํ•จ์ˆ˜(setTimeout, setInterval), Ajax ์š”์ฒญ์€ ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๐Ÿƒ ์ฝœ๋ฐฑ ํ—ฌ(Callback hell)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์€ ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ ์š”์ฒญ์ด ๋ธ”๋กœํ‚น(์ž‘์—… ์ค‘๋‹จ)๋˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋„ค์ŠคํŒ…(nesting, ์ค‘์ฒฉ)๋˜์–ด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ์ฝœ๋ฐฑ ํ—ฌ(Callback hell) ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
  • ์ฝœ๋ฐฑ ํ—ฌ์€ ๊ฐ€๋…์„ฑ์„ ๋‚˜์˜๊ฒŒ ํ•˜๋ฉฐ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์›์ด์ด ๋œ๋‹ค.
  • ๋ฐ‘์— ์ฝ”๋“œ๋Š” ์ฝœ๋ฐฑ ํ—ฌ์˜ ์˜ˆ์ œ์ด๋‹ค.
step1(function (value1) {
  step2(value1, function (value2) {
    step3(value2, function (value3) {
      step4(value3, function (value4) {
        step5(value4, function (value5) {
          // value5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒ˜๋ฆฌ
        });
      });
    });
  });
});

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Promise์˜ ์ƒ์„ฑ

  • ํ”„๋กœ๋ฏธ์Šค๋Š” Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™” ํ•œ๋‹ค.
  • Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve์™€ reject ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  // Promise ๊ฐ์ฒด์˜ ์ƒ์„ฑ
  const promise = new Promise((resolve, reject) => {
    // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    if (/* ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰ ์„ฑ๊ณต */) {
      resolve('result');
    }
    else { /* ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰ ์‹คํŒจ */
      reject('failure reason');
    }
  });

  • Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต(fullfilled)ํ•˜์˜€๋Š”์ง€, ๋˜๋Š” ์‹คํŒจ(rejected)ํ•˜์˜€๋Š”์ง€ ๋“ฑ์˜ ์ƒํƒœ(state)์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • Promise ์ƒํƒœ ์ •๋ณด promise์ƒํƒœ

  • Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ ์ „๋‹ฌ ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ Promise๋Š” fullfilled ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ Promise๋Š” rejected์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

const promiseAjax = (method, url, payload) => {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();

    xhr.open(method, url);
    xhr.setRequestHeader("Content-type", "application/json");
    xhr.send(JSON.stringify(payload));

    xhr.onreadystatechange = function () {
      // ์„œ๋ฒ„ ์‘๋‹ต ์™„๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ฌด์‹œ
      if (xhr.readyState !== XMLHttpRequest.DONE) return;

      if (xhr.status >= 200 && xhr.status < 400) {
        // resolve ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ
        resolve(xhr.response); // Success!
      } else {
        // reject ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ
        reject(new Error(xhr.status)); // Failed...
      }
    };
  });
};
  • ์œ„์˜ ์˜ˆ์ œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์„ฑ๊ณตํ•˜๋ฉด resolve ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ resolve ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•˜๋ฉด reject ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ reject ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ ์œ„์˜ ์˜ˆ์ œ์—์„œ XMLHttpRequest์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๋ฉด
  - .open(method, url, async, username, passowrd): HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ง€์ •ํ•œ๋‹ค.
    1. method: ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก ๋ฐฉ๋ฒ•์„ ์ง€์ •, "GET" ๋˜๋Š” "POST"๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. url: HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์›๊ฒฉ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ.
    3. async: ์š”์ฒญ์„ ๋™๊ธฐ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ• ์ง€์˜ ์—ฌ๋ถ€ true์ด๋ฉด ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ, false๋ฉด ๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ(์ƒ๋žต ๊ฐ€๋Šฅ)
    4. username, password: http ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์ • ์ •๋ณด(์ƒ๋žต ๊ฐ€๋Šฅ)

  - .send(content): open์— ์ง€์ •ํ•œ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.
    1. content: HTTP ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†กํ•  ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜๋Š” ์ฝ˜ํ…์ธ ์ด๋‹ค.

  - .setRequestHeader(key,value) : key/value ์Œ์˜ HTTP ํ—ค๋”๋ฅผ ์ „์†ก ๋ชฉ๋ก์— ๋”ํ•ฉ๋‹ˆ๋‹ค.

  - .onreadystatechange: HTTP์š”์ฒญ์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    1. 0 (UNSENT) : XMLHttpRequest ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ.
    2. 1 (OPENED) : open() ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋จ.
    3. 2 (HEADERS_RECEIVED) : HTTP ์š”์ฒญ์„ ๋ณด๋‚ด์–ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์ค‘. ํ—ค๋”๋Š” ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ.
    4. 3 (LOADING) : ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ ์ค‘์ž„.
    5. 4 (DONE) : ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ์‘๋‹ตํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋จ. ๋น„๋กœ์†Œ responseText ์™€ responseXML ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ.

  - .responseText : ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ…์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  - .responseXML : ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์‘๋‹ต์„ XML DOM ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. XML ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ XML DOM์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์—ผ๋‘ํ•ด ๋‘์„ธ์š”.
  - .status : HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ˆซ์ž๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด OK์— ๋Œ€ํ•ด์„œ 200์„, ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„์ˆ˜ ์—†์—ˆ์„ ๋•Œ๋Š” 404๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  - .statusText : HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด "OK", "Not Found" ๋“ฑ์ด ๋ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Promise์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

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

  • Promise๋กœ ๊ตฌํ˜„๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
  • Promise๋กœ ๊ตฌํ˜„๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ธก(Promise consumer)์—์„œ๋Š” Promise ๊ฐ์ฒด์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ(then, catch)๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • Promise ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ๊ฐ–๋Š” ๋‹ค๊ณ  ํ•˜์˜€๋‹ค.(fullfilled, rejected ๋“ฑ) ์ด ์ƒํƒœ์— ๋”ฐ๋ผ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒด์ด๋‹ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

๐Ÿƒ then

  • then ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต(fullfilled, resolve ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ) ์‹œ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์‹คํŒจ(rejected, reject ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ)์‹œ ํ˜ธ์ถœ๋œ๋‹ค.

๐Ÿƒ catch

  • ์˜ˆ์™ธ(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์™€ then ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ๋œ๋‹ค.
  • catch ๋ฉ”์„œ๋“œ๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

promiseAjax("GET", "http://jsonplaceholder.typicode.com/posts/1")
  .then(JSON.parse)
  .then(
    // ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต(fulfilled, resolve ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ) ์‹œ ํ˜ธ์ถœ๋œ๋‹ค.
    render,
    // ๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์‹คํŒจ(rejected, reject ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ) ์‹œ ํ˜ธ์ถœ๋œ๋‹ค.
    console.error
  );
  • ์œ„์˜ ์˜ˆ์ œ์—์„œ promiseAjax์€ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Promise ๊ฐ์ฒด์˜ ํ›„์† ๋ฉ”์„œ๋“œ(then, catch)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Promise ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋Š” Promise ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ(then, catch, finally)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๋งํ–ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” then ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
const wrongUrl = "https://jsonplaceholder.typicode.com/XXX/1";

// ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์บ์น˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
promiseAjax("https://jsonplaceholder.typicode.com/todos/1").then(
  (res) => console.xxx(res),
  (err) => console.error(err)
);
  • ํ•˜์ง€๋งŒ, then์˜ ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์บ์น˜ ๋ชปํ•˜๊ณ , ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ์„œ ๊ฐ€๋…์„ฑ์— ์ข‹์ง€ ์•Š๋‹ค!

promiseAjax("https://jsonplaceholder.typicode.com/todos/1")
  .then((res) => console.xxx(res))
  .catch((err) => console.error(err)); // TypeError: console.xxx is not a function
  • catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋“  then๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์— ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ(rejectํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ then ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊นŒ์ง€ ๋ชจ๋‘ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ช…ํ™•ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” then ๋ฉ”์„œ๋“œ์—์„œ ํ•˜์ง€ ๋ง๊ณ  catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์ค‘์ฒฉ(๋„ค์ŠคํŒ…, nesting)๋˜์–ด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ์ฝœ๋ฐฑ ํ—ฌ์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค๋Š” ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ฒด์ด๋‹(chainning)ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ํ—ฌ์„ ํ•ด๊ฒฐํ•œ๋‹ค.
  • Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์ธ then์ด๋‚˜ catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, then ๋ฉ”์„œ๋“œ๊ฐ€ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉด(then ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.) ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const url = "http://jsonplaceholder.typicode.com/posts";

// ํฌ์ŠคํŠธ id๊ฐ€ 1์ธ ํฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
promiseAjax("GET", `${url}/1`)
  // ํฌ์ŠคํŠธ id๊ฐ€ 1์ธ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  ํฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  .then((res) => promiseAjax("GET", `${url}?userId=${JSON.parse(res).userId}`))
  .then(JSON.parse)
  .then(render)
  .catch(console.error);

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Promise.all

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…๋“ค์ด ์กด์žฌํ•˜๊ณ  ์ด๋“ค์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Promise.all์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • Promise.all๋ฉ”์„œ๋“œ๋Š” Promise๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ž๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
  • ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ resolveํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Promise.all([
  new Promise((resolve) => setTimeout(() => resolve(1), 3000)), // 1
  new Promise((resolve) => setTimeout(() => resolve(2), 2000)), // 2
  new Promise((resolve) => setTimeout(() => resolve(3), 1000)), // 3
])
  .then(console.log) // [ 1, 2, 3 ]
  .catch(console.log);
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋ชจ๋“  Promise์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ๊ฐ๊ฐ์˜ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolveํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ resolveํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ด๋•Œ, ์ฒซ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ๋˜๋”๋ผ๋„ Promise.all ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋Š” ์ฒซ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolveํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐฐ์—ด์„ resolveํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.

์ฐธ๊ณ 

https://babtingdev.tistory.com/45 https://poiemaweb.com/es6-promise https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise https://ko.javascript.info/promise-basics