[🚨 Error 🚨] mapν•¨μˆ˜ 비동기 μ—λŸ¬

우혁·2024λ…„ 7μ›” 16일

🚨 Error 🚨

λͺ©λ‘ 보기
11/11
post-thumbnail

λ¬Έμ œκ°€ λ°œμƒν•œ λ°°κ²½

λ¬Έμžμ—΄ λ°°μ—΄ μ•ˆμ— μžˆλŠ” url듀을 api 톡신을 톡해 얻은 κ²°κ³Ό κ°’μœΌλ‘œ λ³€ν™˜ν•˜λ €κ³  mapν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ Promise의 κ²°κ³Όκ°€ pending μƒνƒœλ‘œ λ‚˜μ˜€λŠ” 상황이닀.


문제의 원인 μ•Œμ•„λ³΄κΈ°

map ν•¨μˆ˜μ•ˆμ— 콜백 ν•¨μˆ˜μ—λŠ” async/await을 톡해 λΉ„λ™κΈ°μ μœΌλ‘œ λ™μž‘ν•  수 있게 μ„€μ • ν•΄μ£Όμ—ˆμ§€λ§Œ map ν•¨μˆ˜λŠ” λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— asyncν•¨μˆ˜ λ‚΄λΆ€μ˜ await문이 μ‹€ν–‰λ˜κΈ° 전에 mapν•¨μˆ˜κ°€ μ™„λ£Œλ˜κΈ° λ•Œλ¬Έμ— pending μƒνƒœμ— μ½˜μ†”μ— 좜λ ₯λ˜μ—ˆλ‹€.


문제 ν•΄κ²° 방법

  • Promise.all() μ‚¬μš©ν•˜κΈ°

πŸ’‘ Promise.all() μ΄λž€
순회 κ°€λŠ₯ν•œ 객체에 μ£Όμ–΄μ§„ λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ μ΄ν–‰ν•œ ν›„ ν˜Ήμ€ ν”„λ‘œλ―ΈμŠ€κ°€ μ£Όμ–΄μ§€μ§€ μ•Šμ•˜μ„ λ•Œ μ΄ν–‰ν•˜λŠ” μ¦‰μ‹œ μ„±κ³΅ν•˜λŠ” ν”„λ‘œλ―ΈμŠ€(resolve)λ₯Ό λ°˜ν™˜ν•œλ‹€. λ§Œμ•½ μ£Όμ–΄μ§„ ν”„λ‘œλ―ΈμŠ€ 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•œ 경우 λͺ¨λ“  ν”„λ‘œλ―ΈμŠ€κ°€ μ‹€νŒ¨ν–ˆλ‹€κ³  νŒλ‹¨ν•œλ‹€.

  const posts = await Promise.all(
    data?.post.map(async (url) => {
      const response = await fetch(
        `${protocol}://${hostname}/api/proxy?url=${url}`,
      );
      const data = await response.json();
      return data;
    }),
  );

ν•˜μ§€λ§Œ 이런 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ dataκ°€ undefined 일 경우 μ˜΅μ…”λ„ 체이닝(?.)에 μ˜ν•΄ null을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μˆœνšŒν•  수 μ—†μ–΄ ts μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

  • ts μ—λŸ¬ λ©”μ„Έμ§€
이 호좜과 μΌμΉ˜ν•˜λŠ” μ˜€λ²„λ‘œλ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ˜€λ²„λ‘œλ“œ 1/2('(values: readonly unknown[] | []): Promise<[] | unknown[]>')μ—μ„œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
'Promise<any>[] | undefined' ν˜•μ‹μ˜ μΈμˆ˜λŠ” 'readonly unknown[] | []' ν˜•μ‹μ˜ 맀개 λ³€μˆ˜μ— 할당될 수 μ—†μŠ΅λ‹ˆλ‹€.
'undefined' ν˜•μ‹μ€ 'readonly unknown[] | []' ν˜•μ‹μ— ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ˜€λ²„λ‘œλ“œ 2/2('(values: Iterable<any>): Promise<any[]>')μ—μ„œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
'Promise<any>[] | undefined' ν˜•μ‹μ˜ μΈμˆ˜λŠ” 'Iterable<any>' ν˜•μ‹μ˜ 맀개 λ³€μˆ˜μ— 할당될 수 μ—†μŠ΅λ‹ˆλ‹€.
'undefined' ν˜•μ‹μ€ 'Iterable<any>' ν˜•μ‹μ— ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€.

1. ifλ¬Έ μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•˜κΈ°

if (!data) {
  return;
}

const posts = await Promise.all(
  data.post.map(async (url) => {
    const response = await fetch(`${protocol}://${hostname}/api/proxy?url=${url}`);
    const data = await response.json();
    return data;
  }),
);

2. Nullish Coalescing μ—°μ‚°μž(??) μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•˜κΈ°

const posts = await Promise.all(
  (data?.post ?? []).map(async (url) => {
    const response = await fetch(`${protocol}://${hostname}/api/proxy?url=${url}`);
    const data = await response.json();
    return data;
  }),
);

μœ„μ™€ 같은 방법듀을 ν™œμš©ν•΄μ„œ data μžˆλ‹€λŠ” 것을 보μž₯ν•˜κ±°λ‚˜ 없을 경우λ₯Ό λŒ€μ²˜ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆλ‹€.


πŸ™ƒ 도움이 λ˜μ—ˆλ˜ μžλ£Œλ“€

Array.prototype.map() - MDN λ¬Έμ„œ
Promise.all() - MDN λ¬Έμ„œ

profile
🏁

0개의 λŒ“κΈ€