[240730] TIL

λ”₯λ‹€μ΄λΈŒ 44μž₯

  • 44μž₯ promise 읽고 λ…Έμ…˜μ— 정리함
  • μ½œλ°±ν—¬μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ λ‚˜μ˜΄
  • μ—λŸ¬μ²˜λ¦¬λ„ 어렀움

ν”„λ‘œλ―ΈμŠ€μ˜ 후속 처리 λ©”μ„œλ“œ

  • ν”„λ‘œλ―ΈμŠ€μ˜ 비동기 처리 μƒνƒœκ°€ λ³€ν™”ν•˜λ©΄ 후속 처리 λ©”μ„œλ“œμ— 인수둜 μ „λ‹¬ν•œ 콜백 ν•¨μˆ˜κ°€ μ„ νƒμ μœΌλ‘œ ν˜ΈμΆœλœλ‹€.
  • 후속 처리 λ©”μ„œλ“œμ˜ μ½œλ°±ν•¨μˆ˜μ— ν”„λ‘œλ―ΈμŠ€μ˜ 처리 κ²°κ³Όκ°€ 인수둜 전달
  • λͺ¨λ“  후속 μ²˜λ¦¬λŠ” promise λ°˜ν™˜
  • then, catch, finally 제곡

1. Promise.prototype.then

  • 2개의 μ½œλ°±ν•¨μˆ˜λ₯Ό 인수둜 전달 λ°›μŒ
  • 첫 번째 콜백 ν•¨μˆ˜λŠ” ν”„λ‘œλ―ΈμŠ€κ°€ fulfilled μƒνƒœκ°€ 되면 호좜
  • 두 번째 콜백 ν•¨μˆ˜λŠ” ν”„λ‘œλ―ΈμŠ€κ°€ rejected μƒνƒœκ°€ 되면 호좜
  • promise λ°˜ν™˜
// fulfilled
new Promise((resolve) => resolve("fulfilled")).then(
  (v) => console.log(v),
  (e) => console.error(e)
); // fulfilled

// rejected
new Promise((_, reject) => reject(new Error("rejected"))).then(
  (v) => console.log(v),
  (e) => console.error(e)
); // Error: rejected
  • then λ©”μ„œλ“œλŠ” μ–Έμ œλ‚˜ ν”„λ‘œλ―ΈμŠ€ λ°˜ν™˜
    • then λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜κ°€ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜λ©΄ κ·Έ ν”„λ‘œλ―ΈμŠ€ κ·ΈλŒ€λ‘œ λ°˜ν™˜
    • ν”„λ‘œλ―ΈμŠ€κ°€ μ•„λ‹Œ 값을 λ°˜ν™˜ν•˜λ©΄ μ•”λ¬΅μ μœΌλ‘œ resolve λ˜λŠ” reject ν•˜μ—¬ ν”„λ‘œλ―ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜

2. Promise.prototype.catch

  • rejected μƒνƒœμΈ 경우 호좜
  • ν•œ 개의 콜백 ν•¨μˆ˜ 인수둜 전달
  • promise λ°˜ν™˜
// rejected
new Promise((_, reject) => reject(new Error("rejected"))).catch((e) =>
  console.log(e)
); // Error : rejected

3. Promise.prototype.finally

  • 성곡, μ‹€νŒ¨ 상관 없이 무쑰건 ν•œ 번 호좜
  • promise λ°˜ν™˜
new Promise(() => {}).finally(() => console.log("finally")); // finally

ν”„λ‘œλ―ΈμŠ€μ˜ μ—λŸ¬ 처리

  • μ—λŸ¬ μ²˜λ¦¬λŠ” then λ©”μ„œλ“œμ—μ„œ ν•˜μ§€λ§κ³  catch λ©”μ„œλ“œμ—μ„œ ν•˜λŠ” 것을 ꢌμž₯

ν”„λ‘œλ―ΈμŠ€ 체이닝

  • then, catch, finally 후속 처리 λ©”μ„œλ“œλŠ” 콜백 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€. μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•  수 있고, 이λ₯Ό ν”„λ‘œλ―ΈμŠ€ 체이닝이라 함
  • ν›„μ†μ²˜λ¦¬ λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜κ°€ ν”„λ‘œλ―ΈμŠ€κ°€ μ•„λ‹Œ 값을 λ°˜ν™˜ν•˜λ”λΌλ„ μ•”λ¬΅μ μœΌλ‘œ resolve λ˜λŠ” reject ν•˜μ—¬ ν”„λ‘œλ―ΈμŠ€λ₯Ό 생성해 λ°˜ν™˜ν•œλ‹€.
  • ν”„λ‘œλ―ΈμŠ€ 체이닝을 톡해 비동기 처리 κ²°κ³Όλ₯Ό 전달받아 후속 처리 ν•˜λ―€λ‘œ, μ½œλ°±ν—¬μ΄ λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ, 콜백 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ”λ° 가독성이 μ’‹μ§€ μ•Šλ‹€.

β†’ ES8μ—μ„œ λ„μž…λœ async/await λ₯Ό 톡해 ν•΄κ²° κ°€λŠ₯

ν”„λ‘œλ―ΈμŠ€μ˜ 정적 λ©”μ„œλ“œ

1. Promise.resolve / Promise.reject

  • 이미 μ‘΄μž¬ν•˜λŠ” 값을 λž˜ν•‘ν•˜μ—¬ ν”„λ‘œλ―ΈμŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
const resolvedPromise = Promise.resolve([1, 2, 3]);
resolvedPromise.then(console.log); // [1,2,3]

// μ•„λž˜μ™€ 동일
const resolvedPromise = new Promise((resolve) => resolve([1, 2, 3]));
resolvedPromise.then(console.log); // [1,2,3]

2. Promise.all

  • μ—¬λŸ¬ 개의 비동기 처리λ₯Ό λͺ¨λ‘ 병렬 μ²˜λ¦¬ν• λ•Œ μ‚¬μš©
  • ν”„λ‘œλ―ΈμŠ€λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” λ°°μ—΄ λ“±μ˜ μ΄ν„°λŸ¬λΈ”μ„ 인수둜 전달 λ°›μŒ
  • 전달받은 λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ λͺ¨λ‘ fullfilled μƒνƒœκ°€ 되면 λͺ¨λ“  처리 κ²°κ³Όλ₯Ό 배열에 μ €μž₯ν•΄ μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€ λ°˜ν™˜
  • ν•˜λ‚˜λΌλ„ rejected μƒνƒœκ°€ 되면 λ‚˜λ¨Έμ§€ ν”„λ‘œλ―ΈμŠ€κ°€ fulfilled μƒνƒœκ°€ λ˜λŠ” 것을 기닀리지 μ•Šκ³  μ¦‰μ‹œ μ’…λ£Œ (then μ‹€ν–‰ μ•ˆν•¨)
const requestData1 = () =>
  new Promise((resolve) => setTimeout(() => resolve(1), 3000));
const requestData2 = () =>
  new Promise((resolve) => setTimeout(() => resolve(2), 2000));
const requestData3 = () =>
  new Promise((resolve) => setTimeout(() => resolve(3), 1000));

Promise.all([requestData1(), requestData2(), requestData3()])
  .then(console.log) // [ 1,2,3 ] => μ•½ 3초 μ†Œμš”
  .catch(console.error);

3. Promise.race

  • Promise.all 처럼 λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ fulfilled μƒνƒœκ°€ λ˜λŠ” 것을 기닀리지 μ•Šκ³ , κ°€μž₯ λ¨Όμ € fulfilled μƒνƒœκ°€ 된 ν”„λ‘œλ―ΈμŠ€μ˜ κ²°κ³Ό 처리λ₯Ό resolve 함

4. Promise.allSettled

  • 전달 받은 ν”„λ‘œλ―ΈμŠ€κ°€ λͺ¨λ‘ settled μƒνƒœ (μˆ˜ν–‰λœ μƒνƒœ)κ°€ 되면 처리 κ²°κ³Όλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

const requestData1 = () =>
  new Promise((resolve) => setTimeout(() => resolve(1), 3000));
const requestData2 = () =>
  new Promise((resolve) => setTimeout(() => resolve(2), 2000));
const requestData3 = () =>
  new Promise((resolve, reject) =>
    setTimeout(() => reject(new Error("Failed")), 1000)
  );

Promise.allSettled([requestData1(), requestData2(), requestData3()])
  .then((results) => console.log(results))
  .catch(console.error); // 이 뢀뢄은 μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
// 좜λ ₯ κ²°κ³Ό
[
  { status: "fulfilled", value: 1 },
  { status: "fulfilled", value: 2 },
  { status: "rejected", reason: Error: Failed }
]

λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐

console.log("script start");

setTimeout(() => {
  console.log("setTimeout");
}, 0);

Promise.resolve()
  .then(() => {
    console.log("promise1");
  })
  .then(() => {
    console.log("promise2");
  });

console.log("script end");
// κ²°κ³Ό
script start
script end
promise1
promise2
setTimeout

  • ν”„λ‘œλ―ΈμŠ€ 후속 처리 λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” νƒœμŠ€ν¬ 큐가 μ•„λ‹ˆλΌ λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐에 μ €μž₯λœλ‹€.
  • λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐 / νƒœμŠ€ν¬ 큐 β†’ 별도
  • λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ νλŠ” νƒœν¬μŠ€ 큐보닀 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€
  • 이벀트 λ£¨ν”„λŠ” 콜 μŠ€νƒμ΄ λΉ„λ©΄ λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ νμ—μ„œ λŒ€κΈ°ν•˜κ³  μžˆλŠ” ν•¨μˆ˜ λ¨Όμ € κ°€μ Έμ˜€κ³ , λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐가 λΉ„λ©΄ νƒœμŠ€ν¬ 큐 ν•¨μˆ˜ κ°€μ Έμ˜΄

fetch

  • XMLHttpRequest 객체와 λ§ˆμ°¬κ°€μ§€λ‘œ HTTP μš”μ²­ 전솑 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ Web API
  • XMLHttpRequest 보닀 κ°„λ‹¨ν•˜κ³  ν”„λ‘œλ―ΈμŠ€ 지원
  • fetch ν•¨μˆ˜λŠ” HTTP 응닡을 λ‚˜νƒ€λ‚΄λŠ” Response 객체λ₯Ό λž˜ν•‘ν•œ Promise 객체λ₯Ό λ°˜ν™˜
const wrongUrl = "https://wrongUrl";

fetch(wrongUrl)
  .then((response) => {
    if (!response.ok) throw new Error(response.statusText);
    return response.json();
  })
  .then((todo) => console.log(todo))
  .catch((err) => console.error(err));
  • fetch λŠ” HTTP μ—λŸ¬ reject μ•ˆν•¨
  • axios λŠ” λͺ¨λ“  HTTP μ—λŸ¬ reject ν”„λ‘œλ―ΈμŠ€ λ°˜ν™˜ν•˜κ³  fetch 보닀 λ‹€μ–‘ν•œ κΈ°λŠ₯ 지원함

Categories:

Updated:

Leave a comment