Skip to content

Latest commit

Β 

History

History
113 lines (81 loc) Β· 3.74 KB

File metadata and controls

113 lines (81 loc) Β· 3.74 KB
title cacheSignal

cacheSignal은 ν˜„μž¬ React μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

cacheSignal을 μ‚¬μš©ν•˜λ©΄ cache() 수λͺ…이 μ–Έμ œ λλ‚˜λŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

const signal = cacheSignal();

레퍼런슀 {/reference/}

cacheSignal {/cachesignal/}

cacheSignal을 ν˜ΈμΆœν•˜λ©΄ AbortSignal을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

import {cacheSignal} from 'react';
async function Component() {
  await fetch(url, { signal: cacheSignal() });
}

Reactκ°€ λ Œλ”λ§μ„ μ™„λ£Œν•˜λ©΄ AbortSignal이 μ€‘λ‹¨λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ μ§„ν–‰ 쀑인 μž‘μ—…μ„ μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ Œλ”λ§μ΄ μ™„λ£Œλœ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • Reactκ°€ μ„±κ³΅μ μœΌλ‘œ λ Œλ”λ§μ„ μ™„λ£Œν•œ 경우
  • λ Œλ”λ§μ΄ μ€‘λ‹¨λœ 경우
  • λ Œλ”λ§μ΄ μ‹€νŒ¨ν•œ 경우

λ§€κ°œλ³€μˆ˜ {/parameters/}

이 ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ°˜ν™˜κ°’ {/returns/}

cacheSignal은 λ Œλ”λ§ 쀑에 호좜되면 AbortSignal을 λ°˜ν™˜ν•©λ‹ˆλ‹€. κ·Έ μ™Έμ˜ κ²½μš°μ— cacheSignal()은 null을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

주의 사항 {/caveats/}

  • cacheSignal은 ν˜„μž¬ React μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” 항상 null을 λ°˜ν™˜ν•©λ‹ˆλ‹€. ν–₯ν›„ ν΄λΌμ΄μ–ΈνŠΈ μΊμ‹œκ°€ κ°±μ‹ λ˜κ±°λ‚˜ λ¬΄νš¨ν™”λ  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μ‚¬μš©λ  μ˜ˆμ •μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 항상 null을 λ°˜ν™˜ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€.
  • λ Œλ”λ§ μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•˜λ©΄ cacheSignal은 null을 λ°˜ν™˜ν•˜μ—¬ ν˜„μž¬ μŠ€μ½”ν”„κ°€ μ˜μ›νžˆ μΊμ‹œλ˜μ§€ μ•ŠμŒμ„ λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€.

μ‚¬μš©λ²• {/usage/}

μ§„ν–‰ 쀑인 μš”μ²­ μ·¨μ†Œν•˜κΈ° {/cancel-in-flight-requests/}

cacheSignal을 ν˜ΈμΆœν•˜μ—¬ μ§„ν–‰ 쀑인 μš”μ²­μ„ 쀑단할 수 μžˆμŠ΅λ‹ˆλ‹€.

import {cache, cacheSignal} from 'react';
const dedupedFetch = cache(fetch);
async function Component() {
  await dedupedFetch(url, { signal: cacheSignal() });
}
μ•„λž˜μ˜ μ˜ˆμ‹œμ²˜λŸΌ λ Œλ”λ§ μ™ΈλΆ€μ—μ„œ μ‹œμž‘λœ 비동기 μž‘μ—…μ„ `cacheSignal`둜 쀑단할 수 μ—†μŠ΅λ‹ˆλ‹€.
import {cacheSignal} from 'react';
// 🚩 Pitfall: The request will not actually be aborted if the rendering of `Component` is finished.
const response = fetch(url, { signal: cacheSignal() });
async function Component() {
  await response;
}

Reactκ°€ λ Œλ”λ§μ„ μ™„λ£Œν•œ ν›„ 였λ₯˜ λ¬΄μ‹œν•˜κΈ° {/ignore-errors-after-react-has-finished-rendering/}

ν•¨μˆ˜κ°€ 였λ₯˜λ₯Ό λ˜μ§€λŠ” 경우 μ·¨μ†Œλ‘œ μΈν•œ 것일 수 μžˆμŠ΅λ‹ˆλ‹€. (예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ 연결이 λ‹«νžŒ 경우) aborted 속성을 μ‚¬μš©ν•˜μ—¬ 였λ₯˜κ°€ μ·¨μ†Œλ‘œ μΈν•œ 것인지 μ‹€μ œ 였λ₯˜μΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ·¨μ†Œλ‘œ μΈν•œ 였λ₯˜λŠ” λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import {cacheSignal} from "react";
import {queryDatabase, logError} from "./database";

async function getData(id) {
  try {
     return await queryDatabase(id);
  } catch (x) {
     if (!cacheSignal()?.aborted) {
        // only log if it's a real error and not due to cancellation
       logError(x);
     }
     return null;
  }
}

async function Component({id}) {
  const data = await getData(id);
  if (data === null) {
    return <div>No data available</div>;
  }
  return <div>{data.name}</div>;
}