Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

Β 

History

History
255 lines (189 loc) Β· 12.5 KB

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